Anahita MCP
OfficialAnahita MCP lets an AI agent search and read Anahita's documentation and API reference through six read-only tools.
Search docs by words and get the best matching sections first.
List every documentation page and its sections.
Read a whole docs page as Markdown or one section with its subsections.
List API services and groups, a service's routes, or routes matching search words.
Read one API route in full: permissions, parameters, body, and responses.
Read one API shape/schema and its fields.
Use it locally with
npx, via the hosted HTTP endpoint, or offline with cached docs; it does not modify anything or send your questions.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Anahita MCPWhich API route lets a person follow a group?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Anahita MCP
Anahita's docs and API reference for AI agents: an MCP server that runs on your computer.
Anahita is open-source social software that an organisation runs for its own community: people, groups, events, articles, photos, videos and custom feeds, in a chronological feed with no tracking. It speaks ActivityPub (the fediverse) and the AT Protocol (Bluesky).
Add this server to Claude, Cursor, VS Code or any other MCP client, and your agent can answer from the docs as they are today, not from what it remembers: how to set up a site, how federation works, which route follows a profile and what it answers.
Runs on your computer. Your client starts it, and there is no account to make. Or add the hosted copy at
https://mcp.anahita.io/mcp, with nothing to install.Reads, and only reads. Six tools, none of which changes anything.
Sends nothing. It fetches two files from www.anahita.io, keeps them on your computer, and searches them there. Your questions never leave your machine through it. The hosted copy keeps nothing of them either.
Works offline with what it fetched last.
Setting it up
With nothing to install
Anahita runs a copy at https://mcp.anahita.io/mcp (MCP's Streamable
HTTP), in Montreal. It keeps no record of the questions or of who asked.
Client | How |
Claude Code |
|
Claude Desktop and claude.ai | Settings › Connectors › Add custom connector, with the address |
Cursor |
|
VS Code |
|
On your computer
You need Node.js 20 or later. Your client runs the
server with npx, which fetches it from
npm the first time.
Claude Code
claude mcp add anahita -- npx -y anahita-mcpClaude Desktop
In Settings › Developer › Edit Config, add it to
claude_desktop_config.json, then restart Claude:
{
"mcpServers": {
"anahita": {
"command": "npx",
"args": ["-y", "anahita-mcp"]
}
}
}Cursor
In ~/.cursor/mcp.json, or .cursor/mcp.json in a project:
{
"mcpServers": {
"anahita": {
"command": "npx",
"args": ["-y", "anahita-mcp"]
}
}
}VS Code
In .vscode/mcp.json in a project, or with MCP: Add Server from the
command palette:
{
"servers": {
"anahita": {
"type": "stdio",
"command": "npx",
"args": ["-y", "anahita-mcp"]
}
}
}Any other client
The server speaks MCP over standard input and output. The command is
npx -y anahita-mcp. To run what is on main before it is published,
npx -y github:anahitasocial/anahita-mcp.
Then ask your agent something like "How does Anahita decide what an old post is worth?" or "Which API route lets a person follow a group, and what does it send back?"
Related MCP server: AI Square Documentation MCP Server
The tools
Tool | Answers |
| The sections of the docs that match, best first, each with the page and section to read and a few lines of it |
| Every page, in its groups, with its sections |
| A page as Markdown, or one section with those under it |
| The API's services in their groups; one service's routes; or the routes that match some words |
| One route in full: who may call it, its parameters and body, and every answer. The path as the reference has it ( |
| One shape the API takes or answers with, and its fields |
source is services for Anahita Services,
the Go services and their API, or web for
Anahita Web, the web app.
A page is named by both, services/the-graph; services alone is its
overview. Every answer gives the www.anahita.io address of what it read.
What it reads
File | What it holds |
Every page of the docs, cut into sections, written when the website is built | |
The API reference, OpenAPI 3.1, made from the services' code |
The website writes them on every change to it and every night, from the
docs of both repositories as they are on main, so they are a day behind
at most. The server fetches them when a tool first needs them, and again an
hour later only if they have changed. The copies are kept in the cache folder of your
system: ~/Library/Caches/anahita-mcp on macOS, ~/.cache/anahita-mcp on
Linux, %LOCALAPPDATA%\anahita-mcp\Cache on Windows. Search is by words,
in the server, with no embeddings and no outside service.
Settings
Variable | What it changes | Default |
| The website the two files are read from: a local build of anahita.io, say |
|
| The folder the copies are kept in | your system's cache folder, as above |
Hosting your own
npx -y anahita-mcp --http answers over HTTP at /mcp instead, for a copy
people add by its address with nothing to install. Hosting it
says how, on any server or on AWS Lambda with deploy/.
Working on it
Changing the code, as a person or with an agent: begin with AGENTS.md, the project's working rules.
npm install
npm test # builds, then runs the tests in test/
npm run build # dist/TypeScript, on the official MCP TypeScript SDK.
File | What it does |
| Starts the server on standard input and output |
| The six tools, and what the agent is told about them |
| Fetches the two files and keeps them |
| The docs tools' answers |
| The API tools' answers |
| Search by words (BM25) |
| The server over HTTP, for a hosted copy, and |
| The hosted copy on AWS Lambda |
| The AWS templates and the script that deploys them |
To try it against the docs as you write them, build
anahita.io (yarn build),
serve its out/ folder, and set ANAHITA_SITE to where it is served. The
tests use a few real pages and routes, in test/fixtures/.
Security
To report a vulnerability, see SECURITY.md. Please don't open a public issue.
Licence
MIT. Anahita Services is under the GNU AGPL-3.0 and Anahita Web under MIT: see Licensing.
Copyright © 2026 Rastin Mehr Design Studio Inc. (rmd studio). Anahita is a registered trademark of Rastin Mehr Design Studio Inc. in Canada.
Credits
Anahita is developed and maintained by rmd studio, a software development company in Vancouver, Canada. Founder and core architect: Rastin Mehr.
Available Tools
6 toolslist_docsList the docsARead-onlyIdempotent
Lists every page of Anahita's docs, in its groups, with each page's name for read_doc and its sections.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | Only the docs of Anahita Services ("services") or Anahita Web ("web") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world and non-destructive, so the safety profile is covered. The description adds value beyond them by describing the shape of what comes back: pages nested in groups, page handles usable in read_doc, plus sections.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with no filler, and the core action ('Lists every page') is front-loaded. The trailing clause about page names and sections is dense but each element carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read tool with no output schema, the description conveys enough to call it and roughly what comes back. It does not address volume or pagination for a full enumeration, nor how the optional source filter interacts with 'every page'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'source' parameter is documented with its enum in the schema, so the baseline is 3. The description adds nothing about filtering and its 'every page' wording slightly obscures that the optional source parameter narrows the listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (lists) and resource (every page of Anahita's docs) and sketches the response structure (groups, page names, sections). It also names read_doc, making the relationship to that sibling explicit rather than tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the mention of 'each page's name for read_doc' hints that this is the discovery step before reading, but there is no explicit when-to-use or when-not, and no routing against search_docs, which is the obvious alternative for targeted lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_endpointsList the API routesARead-onlyIdempotent
Lists the API's services in their groups; with a service, its routes; with words, the routes that match them.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Words to find a route by, such as "follow a group" | |
| service | No | A service, such as "auth" or "socialgraph-service" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world and non-destructive, so safety is covered. The description adds genuinely new behavioral information: the response shape changes depending on arguments (grouped services, a service's routes, or word-matching routes). It does not clarify what happens when both arguments are supplied, which is the main remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with no filler, and the base case (grouped services) is front-loaded before the narrowing modes. The semicolon-chained clauses are compact but slightly harder to parse than separate sentences would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns; it partially does so (groups, routes, matches) but not the structure or pagination. The unstated precedence when both query and service are provided leaves an agent guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so individual parameter meaning is already documented. The description still adds interaction semantics the schema does not state: service narrows to that service's routes, query selects matching routes, and with neither you get grouped services.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Lists the API's services in their groups') and describes the three result shapes. It distinguishes itself reasonably from siblings like read_endpoint and read_shape by covering the enumeration case, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'with a service... with words...' phrasing implies how to pick a mode, but there is no explicit when-to-use guidance or reference to alternatives such as read_endpoint for fetching a single route. Usage must be inferred from parameter descriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_docRead a pageARead-onlyIdempotent
Reads one page of the docs as Markdown, or one section of it with the sections under it.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | The page: "services/the-graph", "web/configuration", "services" for its overview, or its www.anahita.io address | |
| section | No | A section, by its id ("how-a-type-is-named") or its heading |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, idempotent read operation, so the description is not required to explain safety. It does add useful behavior beyond the annotations: output is Markdown, and selecting a section includes the sections beneath it. It leaves out error behavior for missing pages or sections and any size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It states the core action and the main variant immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the read-only annotations, complete parameter schema, and no output schema, the definition is mostly complete. However, it does not say what happens when a page or section is missing, whether large pages are truncated, or how section paths are matched.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline would be 3. The description exceeds that by clarifying what the section parameter does: it returns that section together with the sections under it, which the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it reads one page of the docs as Markdown, or a section of that page. This clearly separates it from list_docs and search_docs, though it does not explicitly distinguish it from read_endpoint or read_shape.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the contrast between reading a whole page and reading a section, but there is no explicit guidance on when to use this instead of list_docs or search_docs. The agent must infer the selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_endpointRead a routeARead-onlyIdempotent
Reads one API route in full: who may call it, its parameters and body, and every answer it gives.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The path, as the reference has it ("/actors/{id}") or as it is called ("/actors/12") | |
| method | Yes | GET, POST, PUT, PATCH or DELETE |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds that the result is a complete view of a single route (permissions, params, body, all responses), but says nothing about behavior for unknown methods/paths or how exact the match must be.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that enumerates the returned content without filler. It is efficient, though the enumeration is doing double duty as both scope and return-value summary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description rightly sketches what comes back (permissions, parameters/body, responses), and both required params are fully specified in the schema. Only the mismatch/not-found behavior is unaddressed, a minor gap for a two-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both method and path are already documented, including the literal-vs-template path forms. The description adds no formatting or matching semantics beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reads one API route in full') and enumerates the retrieval contents: permissions, parameters/body, and responses. This makes it clearly distinct from list_endpoints and read_doc, though it never names a sibling to sharpen the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'one ... in full' hints at the detail counterpart to list_endpoints, but the description never says when to prefer this over list_endpoints, read_doc, or read_shape, nor any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_shapeRead a shapeBRead-onlyIdempotent
Reads one shape of the API (a schema a route takes or answers with) and its fields.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The shape, such as "Refusal", as read_endpoint names it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint false and openWorldHint false, so the safety profile is fully covered structurally. The description adds only that fields are included in the result; it says nothing about failure behavior for unknown shape names or result size, which would have been the value-add.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the verb and resource first, then the clarifying parenthetical. No filler, though the parenthetical is slightly dense compared to splitting the 'fields' detail out.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with rich annotations, the description is adequate but thin: it does not state how shape names are discovered (only the schema hints at read_endpoint), nor what the returned structure looks like beyond 'its fields'. No output schema exists, so a one-line return description carries that burden loosely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already documents that 'name' is a shape such as "Refusal" as read_endpoint names it. The description adds no further naming, casing, or format guidance beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (one API shape) and defines what a shape is ('a schema a route takes or answers with') plus what is returned ('its fields'). It does not explicitly distinguish itself from siblings like read_endpoint, though the concept is differentiated by the parenthetical.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the reader infers this is the lookup to use once a shape name is known (e.g., from read_endpoint). There is no explicit when-to-use, no exclusions, and no statement of what to do if the shape name is unknown or ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch the docsARead-onlyIdempotent
Searches Anahita's docs by words and gives the best sections first, each with the page and section to read and a line of it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many sections, 8 if left out | |
| query | Yes | Words to look for, such as "custom feed weights" or "federation opt-in" | |
| source | No | Only the docs of Anahita Services ("services") or Anahita Web ("web") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuinely new behavioral context: results are ranked by relevance ("best sections first") and each hit carries a page, a section, and a snippet line — enough to know the response shape without an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the verb and resource, then immediately describes the return shape. No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The three parameters are fully documented in the schema and the description covers the response shape, which is enough to invoke it correctly. What is missing is routing context — the sibling set includes list_docs and read_doc, and the description never explains when a search is better than browsing or fetching a known page, nor what happens when there are no matches.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so query, limit, and source are fully self-documenting; baseline 3 applies. The description adds only that matching is on "words" — it does not clarify ranking interaction with limit or what source filtering does beyond the enum descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Searches Anahita's docs by words" gives a specific verb and resource, and the clause about returning the best sections first with page/section/snippet tells the agent what comes back. It is distinct from list_docs and read_doc by implication of ranked keyword retrieval, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the word "Searches" and "by words" signal keyword lookup rather than browsing or full reads, which the schema's query examples reinforce. There is no explicit statement of when to prefer this over list_docs or read_doc, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
list_docs - First observed
list_endpoints - First observed
read_doc - First observed
read_endpoint - First observed
read_shape - First observed
search_docs
TDQS
Scored across 6 tools
Each tool has a clearly distinct action/resource pairing: browse docs (list_docs), read a page (read_doc), search docs (search_docs), browse API services/routes (list_endpoints), read a route (read_endpoint), read a schema (read_shape). List vs. read vs. search are visibly different operations with no realistic misselection risk.
All names follow a strict verb_noun snake_case pattern (list_*, read_*, search_*), with singular nouns for single-item reads and plural for collections. The convention is predictable and readable throughout.
Six tools is well-scoped for a read-only documentation/API reference server — one tool per content type (docs, endpoints, shapes) each with browse/read/search coverage. Nothing feels padded or missing at the structural level.
The docs surface is complete (list, read, search), but the API surface lacks a dedicated search over routes or shapes and no standalone list_shapes, so shapes are only reachable via read_endpoint. Agents can work around this by browsing list_endpoints, so the gap is minor.
Maintenance
Related MCP Connectors
Read-only MCP server over the developer docs for the portfolio's JSON API, MCP, A2A and NLWeb.
Read-only MCP server for the OrchestKit docs: full-text search + Markdown fetch. No auth.
Search and read the Metabind documentation: MCP Apps, BindJS, the SDKs, the CLI, and the APIs.
Make your knowledge agent-ready. One MCP endpoint, 5 connectors, 3 search modes.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to access and read mdbook documentation, including structure, content, and search.24 npm3MIT
- FlicenseAqualityDmaintenanceEnables MCP clients to retrieve authoritative AI Square documentation, API references, SDK examples, guides, and troubleshooting information through citation-safe hybrid search and static resources.11-
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to search, navigate, and read the complete Hermes Agent documentation through a local SQLite FTS5 index, with tools for full-text search, page reading, and browsing documentation structure.MIT
- AlicenseAqualityBmaintenanceEnables agents to perform full-text search and read Hermes Agent documentation offline from a local cache, without scraping the site.2MIT