Liliphant
com.liliphant.mcp/mcpmcp.liliphant.comstreamable-httpv1.0.0Scanned
Liliphant turns every meeting into connected knowledge, decisions, and actionable insights.
8 tools: 1 can delete or cancel things, 3 change things and 4 only read.
- Reads private data · 3
- Reads text others write · 3
- Can send data out · 1
- 3 findings
Anlyon alternative
4 of these tools change something. Run those as governed actions.
Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.
Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.
Import an OpenAPI spec →Tools
Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.
8 tools
Deletes or cancels 1Claude Code: deny
call_any_api_of_liliphantSend a POST, PUT, PATCH or DELETE request to any Liliphant API API endpoint for the user and return its response.Reads text others writeNo findings
Why it is in this group
- The name "call_any_api_of_liliphant" says "call": a word for a change.
- The description's first verb is "send": a word for sending, and what is sent cannot be taken back.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Send a POST, PUT, PATCH or DELETE request to any Liliphant API API endpoint for the user and return its response. Use it once you know the exact endpoint: look it up with get_liliphant_api_docs first to get its URL, headers, query params and body, unless the skill or a dedicated tool on this server already gives them exactly. Load the quickstart-liliphant skill first: it explains which tool to use when. For GET requests use call_any_read_api_of_liliphant. Pass the full url with path variables filled in, the headers the docs list, query params in `query` (not in the url) and the JSON body in `body`. For the auth header the docs name (Authorization, proxy_auth_token, x-api-key, ...), pass it with an empty value "": the signed-in user's token is filled in automatically. Never put a real or made-up token there; if the docs name no auth header, leave it out and the token is sent as Authorization. If the API needs the user to sign in, they're asked the first time. Returns { status, ok, headers, data }: the HTTP status and the response body, including error details on failure.
Annotations the server declares
- title: Write to Liliphant API
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
Changes things 3Claude Code: ask
ask_a_questionAnswers a plain-language question from the company's processed meetings, with a headline, a short answer, an optional chart and the quotes it is based on.1 finding
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Info
The description is 2,154 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...is missing or expired. POST https://meet-analyzer-api.50agents.com/api/v1/ui/ask"
Description, as the server wrote it Answers a plain-language question from the company's processed meetings, with a headline, a short answer, an optional chart and the quotes it is based on. Use it whenever someone asks what was said, decided or promised in their meetings. Leave out meetingId to search every meeting the asker may see; set it to answer from one meeting only. Who may call it: any member of the company. An owner or admin asks over every meeting in the company; a member asks only over the meetings they may see (ones they booked or were invited to, plus their teams' meetings). The company comes from the x-company-id header. meetingId comes from List Meetings (meetings[].id). This is slow: a minute is normal and up to three minutes happens, so allow a long timeout. A question it cannot answer is still a 200 with chart null and the reason in body: "No conversations in this company yet" when the company has no processed meetings or meetingId names a meeting that does not exist or that the asker may not see; "No conversation covers that yet" when nothing matches; "Could not answer that" when the engine fails, with the reason in body and any failures in warnings and a "What went wrong" block in detail. tags narrow a company-wide question to meetings carrying any of those tags or topic names. Each tag is normalised before matching: trimmed, upper-cased, spaces and underscores turned into dashes, other characters dropped, so "Renewal terms" matches the topic "Renewal terms". tags are ignored when meetingId is set. id is the same for the same question (case and spacing ignored) and the same meetingId, so it can be used to keep the answer on the board with Keep Question on Board. Quotes are only traced to transcript lines in this company's meetings; one that cannot be traced keeps its words with affiliation "from the conversation" and no meetingId. Errors: 400 VALIDATION_FAILED for a missing, too short or too long question, an empty or too long meetingId, a tag over 40 characters or with no letter or digit, more than 10 tags, or any other field; 401 when the token is missing or expired. POST https://meet-analyzer-api.50agents.com/api/v1/ui/ask
Annotations the server declares
- title: Ask a question
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
call_any_read_api_of_liliphantRead from any Liliphant API API endpoint with a GET request for the user and return its response.Reads text others writeCan send data out1 finding
Why it is in this group
- The name "call_any_read_api_of_liliphant" says "call": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe input takes a URL (input.url): a request to a URL can carry data to whoever runs it.
Findings
- Warn
The server marks "call_any_read_api_of_liliphant" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "call_any_read_api_of_liliphant" says "call": a word for a change.
Description, as the server wrote it Read from any Liliphant API API endpoint with a GET request for the user and return its response. Use it once you know the exact endpoint: look it up with get_liliphant_api_docs first to get its URL, headers, query params and body, unless the skill or a dedicated tool on this server already gives them exactly. Load the quickstart-liliphant skill first: it explains which tool to use when. For POST, PUT, PATCH and DELETE use call_any_api_of_liliphant. Pass the full url with path variables filled in, the headers the docs list, and query params in `query` (not in the url). For the auth header the docs name (Authorization, proxy_auth_token, x-api-key, ...), pass it with an empty value "": the signed-in user's token is filled in automatically. Never put a real or made-up token there; if the docs name no auth header, leave it out and the token is sent as Authorization. If the API needs the user to sign in, they're asked the first time. Returns { status, ok, headers, data }: the HTTP status and the response body, including error details on failure.
Annotations the server declares
- title: Read from Liliphant API
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
quickstart-liliphantLiliphant API quickstart: read the user's meetings and ask questions answered from what people actually said.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Liliphant API quickstart: read the user's meetings and ask questions answered from what people actually said. Load before any Liliphant task. Call this to load the full instructions for this skill before doing the task.
Annotations the server declares
- title: Quickstart Liliphant
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
Only reads 4Show 4 read-only tools
get_liliphant_api_docsBrowse the Liliphant API API docs, one level at a time.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "get_liliphant_api_docs" says "get": a word for reading.
What it can reach
- private-dataThe name "get_liliphant_api_docs" says "get" and "doc": it reads documents.
- private-dataThe description's first sentence says "browse" and "doc": it reads documents.
- untrusted-inputThe description's first sentence says "browse": it reads web pages, which anyone can write.
Description, as the server wrote it Browse the Liliphant API API docs, one level at a time. Call it without arguments to get the top level: the modules and pages with a short description and the endpoints they hold. Call it with `path` set to a module's or page's link (or path) to get what is inside it; each listing links the next level. Call it with `path` set to an endpoint's link ending in ".openapi.yml" to get that endpoint as an OpenAPI file: method, url, headers, query params, path variables, a request body example and sample responses. Fetch only the level you need.
Annotations the server declares
- title: Get Liliphant API docs
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_meReturns who is signed in and every company they can open, with their role in each.No findings
Why it is in this group
- The name "get_me" says "get": a word for reading.
Description, as the server wrote it Returns who is signed in and every company they can open, with their role in each. This is the first call a client makes after sign-in: almost every other call needs a company id from companies[].id. Any signed-in person may call it. It also does housekeeping on the way: it makes sure the person's personal company exists and turns any email invitations waiting for them into memberships, so a company someone was just added to shows up here. The x-company-id header is optional here. currentCompanyId tells you which company the server will use for requests that send this header; with no header, or one naming a company the person is not in, it falls back to their personal company instead of failing. Other fields: companyLimit is how many companies a person may create (null means no limit) and companiesCreated is how many they have created so far, for a "New company" button. onboardedAt on each company is null until its setup is finished. Errors: 401 NOT_SIGNED_IN when no token is sent; 401 SESSION_EXPIRED when the token is no longer valid. GET https://meet-analyzer-api.50agents.com/api/v1/ui/me
Annotations the server declares
- title: Get me
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_meetingsLists the analysed meetings the caller may see, as cards, newest first, with the filter choices the Meetings screen offers.Reads private data1 finding
Why it is in this group
- The name "list_meetings" says "list": a word for reading.
What it can reach
- private-dataThe name "list_meetings" says "list" and "meeting": it reads calendars.
- private-dataThe description's first sentence says "list" and "meeting": it reads calendars.
Findings
- Info
The description is 2,512 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...a team they are in. GET https://meet-analyzer-api.50agents.com/api/v1/ui/meetings"
Description, as the server wrote it Lists the analysed meetings the caller may see, as cards, newest first, with the filter choices the Meetings screen offers. Use it to show or search the meeting list, and to find a meetingId for Get Meeting, Get Meeting Transcript, Get Share Link or the notes routes (meetings[].id). Any member of the company may call it, but what comes back depends on their role. An owner or admin sees every meeting in the company. A member sees only the meetings they booked or were invited to, plus every meeting of each team they are in (only their own when they are in no team). It never returns meetings from a company other than the one named in x-company-id. Paging: send limit (1 to 100) to get pages. When there are more results, nextCursor holds a token; pass it back as cursor to get the next page. nextCursor is null on the last page. Without limit, every matching meeting comes back in one response. Never build a cursor yourself. The first page (no cursor) also carries the extras: filters (the types, tags, people and teams that actually occur, each with a count), totals (all meetings the caller may see, and how many of them still need attention, ignoring the filters) and processing (up to 50 meetings the caller may see that are still being analysed, newest first). On later pages filters and totals are null and processing is empty, so keep the first page's copy. meetingCount is the number of matches across all pages. In filters.people, team is true for someone who was ever on the company's side of a call. Filters combine: q searches title, headline, summary, type, tag, a participant's name or email, a team's name, or an exact meeting id; type, tag and person take values from filters; teamId limits to meetings booked by or with that team's members (an id from filters.teams[].value); within keeps meetings from the last N days; from and to pick a custom date range instead; status is open (still needs something) or handled. Team filter: an owner or admin may pass any of the company's teams. A member may pass only a team they are in, and filters.teams lists only their teams. A company with no meetings gets an empty list, not an error. Errors: 400 VALIDATION_FAILED when a query value is out of range, a date cannot be read, or the cursor is not one this server issued; 401 when not signed in or the sign-in expired; 404 TEAM_NOT_FOUND when teamId is not one of this company's teams, or (for a member) not a team they are in. GET https://meet-analyzer-api.50agents.com/api/v1/ui/meetings
Annotations the server declares
- title: List meetings
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
search_liliphant_docsSearch the Liliphant API documentation with a natural-language question.Reads private dataNo findings
Why it is in this group
- The name "search_liliphant_docs" says "search": a word for reading.
What it can reach
- private-dataThe name "search_liliphant_docs" says "search" and "doc": it reads documents.
Description, as the server wrote it Search the Liliphant API documentation with a natural-language question. Returns the most relevant passages with their page URLs.
Annotations the server declares
- title: Search Liliphant API docs
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
9 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 1 outbound tool breaks every one.
- Reads private data3
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write3
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out1
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
{
"permissions": {
"deny": [
"mcp__server__call_any_read_api_of_liliphant"
]
}
}Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Findings
Matches of fixed checks, with the text they matched.
The server marks "call_any_read_api_of_liliphant" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "call_any_read_api_of_liliphant" says "call": a word for a change.
- Infolist_meetings
The description is 2,512 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...a team they are in. GET https://meet-analyzer-api.50agents.com/api/v1/ui/meetings"
- Infoask_a_question
The description is 2,154 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...is missing or expired. POST https://meet-analyzer-api.50agents.com/api/v1/ui/ask"
History
Changes to its tool definitions and to its remote endpoint, newest first.
No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.
Install
Pinned to version 1.0.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http server https://mcp.liliphant.com/mcpclaude mcp add --transport http server https://mcp.liliphant.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__server__search_liliphant_docs",
"mcp__server__get_liliphant_api_docs",
"mcp__server__get_me",
"mcp__server__list_meetings"
],
"ask": [
"mcp__server__call_any_read_api_of_liliphant",
"mcp__server__ask_a_question",
"mcp__server__quickstart-liliphant"
],
"deny": [
"mcp__server__call_any_api_of_liliphant"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as server. Review it before you use it.
Capability tags behind 5 rules
- mcp__server__search_liliphant_docs private-data
- mcp__server__get_liliphant_api_docs private-data, untrusted-input
- mcp__server__call_any_read_api_of_liliphant untrusted-input, outbound
- mcp__server__call_any_api_of_liliphant untrusted-input
- mcp__server__list_meetings private-data
Pin
Keep the decision: fail CI when the tools change, follow every change, or show a badge.
Pin in CI
Fail a build when the tools you reviewed are not the tools the server serves today.
curl -s "https://anlyon.dev/api/v1/servers/com.liliphant.mcp/mcp/verify?hash=5442fe4751ac2bfbf773f8456abc78cc55ce55695abf043d58c2da2103be0583" | jq -e '.changed == false'Pinned hash 5442fe4751ac, from Oct 31, 2026, 09:18 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/com.liliphant.mcp/mcp/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/com.liliphant.mcp/mcp)Source: MCP Registry · repository. Synced Oct 31, 2026, 09:17 UTC.