Skip to main content
Glama

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 mcp add --transport http anahita https://mcp.anahita.io/mcp

Claude Desktop and claude.ai

Settings › Connectors › Add custom connector, with the address

Cursor

"anahita": { "url": "https://mcp.anahita.io/mcp" } under mcpServers in ~/.cursor/mcp.json

VS Code

"anahita": { "type": "http", "url": "https://mcp.anahita.io/mcp" } under servers in .vscode/mcp.json

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-mcp

Claude 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

search_docs(query, source?, limit?)

The sections of the docs that match, best first, each with the page and section to read and a few lines of it

list_docs(source?)

Every page, in its groups, with its sections

read_doc(page, section?)

A page as Markdown, or one section with those under it

list_endpoints(service?, query?)

The API's services in their groups; one service's routes; or the routes that match some words

read_endpoint(method, path)

One route in full: who may call it, its parameters and body, and every answer. The path as the reference has it (/actors/{alias}) or as it is called (/actors/ana)

read_shape(name)

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

www.anahita.io/docs/index.json

Every page of the docs, cut into sections, written when the website is built

www.anahita.io/api/anahita.json

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

ANAHITA_SITE

The website the two files are read from: a local build of anahita.io, say

https://www.anahita.io

ANAHITA_MCP_CACHE

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

src/index.ts

Starts the server on standard input and output

src/server.ts

The six tools, and what the agent is told about them

src/store.ts

Fetches the two files and keeps them

src/docs.ts

The docs tools' answers

src/api.ts

The API tools' answers

src/search.ts

Search by words (BM25)

src/http.ts

The server over HTTP, for a hosted copy, and --http

src/lambda.ts

The hosted copy on AWS Lambda

deploy/

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 tools
list_docsList the docsA
Read-onlyIdempotent

Lists every page of Anahita's docs, in its groups, with each page's name for read_doc and its sections.

NameRequiredDescriptionDefault
sourceNoOnly the docs of Anahita Services ("services") or Anahita Web ("web")

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 routesA
Read-onlyIdempotent

Lists the API's services in their groups; with a service, its routes; with words, the routes that match them.

NameRequiredDescriptionDefault
queryNoWords to find a route by, such as "follow a group"
serviceNoA service, such as "auth" or "socialgraph-service"

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 pageA
Read-onlyIdempotent

Reads one page of the docs as Markdown, or one section of it with the sections under it.

NameRequiredDescriptionDefault
pageYesThe page: "services/the-graph", "web/configuration", "services" for its overview, or its www.anahita.io address
sectionNoA section, by its id ("how-a-type-is-named") or its heading

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 routeA
Read-onlyIdempotent

Reads one API route in full: who may call it, its parameters and body, and every answer it gives.

NameRequiredDescriptionDefault
pathYesThe path, as the reference has it ("/actors/{id}") or as it is called ("/actors/12")
methodYesGET, POST, PUT, PATCH or DELETE

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 shapeB
Read-onlyIdempotent

Reads one shape of the API (a schema a route takes or answers with) and its fields.

NameRequiredDescriptionDefault
nameYesThe shape, such as "Refusal", as read_endpoint names it

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 docsA
Read-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.

NameRequiredDescriptionDefault
limitNoHow many sections, 8 if left out
queryYesWords to look for, such as "custom feed weights" or "federation opt-in"
sourceNoOnly the docs of Anahita Services ("services") or Anahita Web ("web")

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 6 tool updatesv0.1.0
    • First observedlist_docs
    • First observedlist_endpoints
    • First observedread_doc
    • First observedread_endpoint
    • First observedread_shape
    • First observedsearch_docs

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers