Skip to main content
Glama

aleph-mcp

WARNING

This is a Claude one-shot. The whole thing — server, formatters, tests, this README — was written by Claude in a single session, and has had no human review beyond the author reading it over. It works against a live instance (that much was verified), but treat it as a starting point rather than something battle-tested. Read the code before you point it at anything you care about.

A read-only MCP server for Aleph, the open-source investigative data platform that holds leaks, company registries, court records, sanctions lists and document archives. It gives an MCP client ten research tools, built on the official alephclient library.

It talks to any Aleph instance — set ALEPH_HOST. Out of the box it points at OpenAleph, which answers without credentials.

Read-only by design. Every request is a GET. The server cannot create, change or delete anything, and each tool is annotated readOnlyHint so clients can present it as safe.

Quickstart

Drop this in your MCP client's config — no clone, no venv. uvx fetches and runs the server on demand:

{
  "mcpServers": {
    "aleph": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/pkreissel/aleph-mcp", "aleph-mcp"],
      "env": {
        "ALEPH_HOST": "https://search.openaleph.org",
        "ALEPH_API_KEY": ""
      }
    }
  }
}

Leave ALEPH_API_KEY empty and it runs anonymously, which is enough for the default instance (OpenAleph). Point ALEPH_HOST at an instance that needs credentials and paste the key in — that is the only change.

The same thing from the Claude Code CLI:

claude mcp add aleph \
  --env ALEPH_HOST=https://search.openaleph.org \
  --env ALEPH_API_KEY= \
  -- uvx --from git+https://github.com/pkreissel/aleph-mcp aleph-mcp

Then ask your client to search for something. mcp.json in this repo is the same config as a file, with a second entry showing a private instance and an API key. You need uv installed (brew install uv, or curl -LsSf https://astral.sh/uv/install.sh | sh); the first run takes a few seconds to resolve dependencies, later ones are fast.

Related MCP server: mcp-opensearch

Install

The Quickstart needs none of this. These are the options if you want the server on disk rather than resolved on demand.

Run it without installing (uvx)

uv can fetch, build and run the server in a throwaway environment — nothing is left behind:

uvx --from git+https://github.com/pkreissel/aleph-mcp aleph-mcp

From a local checkout, the same thing without the clone:

uvx --from /path/to/aleph-mcp aleph-mcp

This is what the Quickstart config runs, and it keeps no venv path that can go stale when you move the checkout.

Install as a tool

Persistent, on your PATH, still isolated:

uv tool install git+https://github.com/pkreissel/aleph-mcp

aleph-mcp is then on your PATH and speaks MCP over stdio — point a client at it by name rather than by path.

From a checkout

For development, or if you want the source on hand:

git clone https://github.com/pkreissel/aleph-mcp
cd aleph-mcp
uv venv
uv pip install -e .

The entry point is then .venv/bin/aleph-mcp.

Configure

Variable

Required

Purpose

ALEPH_HOST

no

Instance URL. Defaults to https://search.openaleph.org.

ALEPH_API_KEY

depends

API key for that instance. Also read from ALEPHCLIENT_API_KEY / MEMORIOUS_ALEPH_API_KEY by alephclient.

ALEPH_MCP_LOG_LEVEL

no

DEBUG, INFO, WARNING (default), ERROR. Logs go to stderr.

Whether you need a key depends on the instance. Most public ones reject unauthenticated requests to everything except /api/2/metadata, so without a key only aleph_get_schema_info works; get one from your profile page on that instance, under API Key. OpenAleph serves anonymous requests, so no key is needed there.

Claude Code

claude mcp add aleph \
  --env ALEPH_HOST=https://your-instance.org \
  --env ALEPH_API_KEY=your-key \
  -- /path/to/aleph-mcp/.venv/bin/aleph-mcp

Any client using mcpServers JSON

Against a checkout rather than uvx — see the Quickstart for the uvx form:

{
  "mcpServers": {
    "aleph": {
      "command": "/path/to/aleph-mcp/.venv/bin/aleph-mcp",
      "env": {
        "ALEPH_HOST": "https://your-instance.org",
        "ALEPH_API_KEY": "your-key"
      }
    }
  }
}

Hermes Agent

Hermes keeps its servers in ~/.hermes/config.yaml, under a top-level mcp_servers: key — YAML rather than JSON, and note the underscore:

mcp_servers:
  aleph:
    command: "uvx"
    args: ["--from", "git+https://github.com/pkreissel/aleph-mcp", "aleph-mcp"]
    env:
      ALEPH_HOST: "https://search.openaleph.org"
      ALEPH_API_KEY: ""

Then /reload-mcp in a session to pick it up without a restart. Hermes namespaces tools as mcp_<server>_<tool>, so with the server named aleph they arrive as mcp_aleph_aleph_search, mcp_aleph_aleph_get_entity and so on. Servers are scoped per Hermes profile — if the tools do not show up, check you are in the profile you added it to before assuming the install failed.

Several instances at once is just several entries with different ALEPH_HOST values and distinct server names.

Tools

Tool

Purpose

aleph_search

Search entities across every dataset you can read. Filter by schema, country and collection; request facets and highlighted snippets.

aleph_get_entity

Full record for one entity ID, every populated property.

aleph_expand_entity

Entities connected to this one, grouped by relationship type.

aleph_similar_entities

Candidate matches for the same real-world subject in other datasets.

aleph_list_collections

Discover datasets, filtered by name, category or country.

aleph_get_collection

Dataset metadata: publisher, source, coverage, update frequency, entity-type breakdown.

aleph_xref_results

Read cross-reference matches already computed for a dataset.

aleph_statistics

Instance size and shape, by entity type, category and country.

aleph_get_schema_info

followthemoney model reference: schemata and their properties.

aleph_fetch_document_text

Extracted text of a document entity, for quoting and verification.

How Aleph models data

Worth knowing, because it shapes how the tools chain together.

Everything is an entity with a schema (Person, Company, Document, Ownership, …) belonging to a collection (a dataset). Schemata inherit: Person extends LegalEntity extends Thing, and a search for LegalEntity returns companies and people alike.

Relationships are themselves entities. A person is not linked to a company by a field on the person; there is a separate Directorship entity pointing at both. That is why aleph_expand_entity exists — you cannot see the network by reading one record.

A typical investigation:

  1. aleph_search for the subject, narrowed by schema and countries.

  2. aleph_get_entity on the best hit for the full record.

  3. aleph_expand_entity to walk to officers, owners and addresses.

  4. aleph_similar_entities to find the same subject in other datasets.

  5. aleph_fetch_document_text to read the source document behind a claim.

Long documents store their text on child Page entities rather than the parent Document; if aleph_fetch_document_text finds no text, expand the document and fetch a page.

Results are search hits, not verified facts. Datasets are full of namesakes — confirm identity against birth dates, addresses or registration numbers before treating two records as the same person.

Output

Tools return compact text, not raw JSON. A page of Aleph results is tens of kilobytes of index bookkeeping; each entity is rendered down to its caption, schema, the featured properties for that schema, its source dataset, its entity ID and a URL that opens the record in the instance's web UI. IDs and URLs are always present, so every claim can be traced back to the source.

Instance notes

Instances differ in more than their data.

Bot filters. Some sit behind a proof-of-work challenge — search.openaleph.org uses Anubis, which 307-redirects unrecognised clients to a challenge page instead of returning JSON. It allowlists by User-Agent, and alephclient sends alephclient/<version>, which passes; plain curl or python-requests does not. So this server works as shipped, but anything that overrides the session User-Agent will start getting HTML back.

Reachable data. What a search returns is a function of the instance and of the key you gave it. aleph_list_collections and aleph_statistics are the quickest way to see what an instance actually holds before searching it.

Development

uv pip install -e ".[dev]"
.venv/bin/python -m pytest

The suite covers formatting, parameter construction, error mapping and an end-to-end stdio handshake against the real server process. It needs no network access and no API key: tests/metadata.json is a verbatim capture of a live instance's /api/2/metadata, so formatters run against the real followthemoney model.

Layout

src/aleph_mcp/
  server.py   tool definitions, argument schemas, error messages
  client.py   read-only Aleph access layered on alephclient
  format.py   API payloads -> compact text

alephclient supplies host/key configuration, the auth header and the session. It wraps only part of the API, so endpoints it does not cover (search with facets, expand, similar, xref, statistics, metadata) are issued as raw GETs over the same configured session.

Licence

MIT.

Available Tools

10 tools
aleph_expand_entityA
Read-only

List the entities connected to this one, grouped by relationship type (directorships, ownerships, addresses, family, document mentions). This is how you walk a network: relationships in Aleph are entities, so they do not appear as plain fields on the record itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax entities per relationship group.
entity_idYesEntity ID to expand.
propertiesNoOnly follow these property names, e.g. ['directorshipDirector', 'ownershipOwner']. Omit to follow every relationship.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and non-destructive behavior. The description adds valuable context about Aleph's data model: relationships are entities themselves, so they won't appear as plain fields on the record, and results are grouped by relationship type. This helps the agent set expectations beyond the annotations.

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?

Two sentences with no filler. The core action and output shape are front-loaded, and the data-model explanation is kept to one compact second sentence.

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?

The description is adequate for a read-only network traversal tool: it identifies the input, the output, and an important conceptual gotcha. It does not describe pagination or exact response structure, but the schema covers limit and properties, so no critical operational detail is missing.

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 each parameter is already documented in the schema. The description does not add new parameter-level detail beyond implying traversal and grouping, which is sufficient but not exemplary given full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), a clear resource ('entities connected to this one'), and the output structure ('grouped by relationship type'). It also names representative relationship types, making the tool's role distinct from siblings like aleph_get_entity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'This is how you walk a network' gives a clear when-to-use signal, and the explanation that relationships are entities helps an agent understand why it must use this tool rather than looking for plain fields on a record. It does not explicitly discuss alternatives, but the intended traversal use case is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aleph_fetch_document_textA
Read-only

Read the extracted text of a document entity (PDF page, email, article) so you can quote or verify what it actually says. Pass the entity ID of a Document, Pages, Email or similar entity from a search result.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesEntity ID of the document.
max_charsNoTruncate the text at this many characters.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false, and the description's 'Read' matches. It adds that the tool returns extracted text rather than metadata, but it doesn't say whether output is a raw string, how max_chars affects the result, or what happens when no text is extracted. No contradiction with annotations.

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?

Two sentences, no filler. The core purpose is front-loaded, and the usage note is second. Every clause earns its place.

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?

For a read-only tool with two well-documented params and no output schema, the description gives the agent what it needs: what it does, what input to pass, and why to use it. A minor gap is not spelling out the return shape or truncation effect, but the schema already documents max_chars.

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?

The schema covers both parameters fully (100%), but the description adds semantic context for entity_id: it must be a Document, Pages, Email or similar entity from a search result. That is useful beyond the schema's generic 'Entity ID of the document.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Read') and resource ('extracted text of a document entity'), enumerating example entity types (PDF page, email, article) and a concrete purpose (quoting/verifying). This clearly distinguishes it from siblings like aleph_get_entity, which would satisfy a general 'fetch entity' interpretation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use it: after a search, when you need the actual text to quote or verify, and it tells you to pass an entity ID from search results. It does not explicitly name alternative tools or exclusion criteria, so a small inference is left to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aleph_get_collectionA
Read-only

Full metadata for one dataset: publisher, source URL, coverage, update frequency and a breakdown of what entity types it contains. Use it to judge how far a source can be trusted and how current it is.

ParametersJSON Schema
NameRequiredDescriptionDefault
collection_idYesCollection (dataset) ID.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, open-world, and non-destructive behavior. The description adds useful expectations about what the returned metadata contains, which is especially valuable since there is no output schema. No contradiction with annotations.

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?

Two tight sentences with the key content front-loaded and no filler. Every clause contributes to selection or invocation.

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?

For a simple read-only call with one required parameter, the description adequately covers what the tool returns and when to use it. It does not specify error behavior or where to find the ID, but those are minor gaps.

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 'collection_id' is self-documented as 'Collection (dataset) ID.' The description adds the 'dataset' synonym but does not need to elaborate further; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as 'one dataset' and specifies the exact content returned: publisher, source URL, coverage, update frequency, and entity-type breakdown. This makes it easy to distinguish from entity-search or collection-listing siblings even without reading their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a concrete usage rule: use it to judge source trustworthiness and currency. It lacks explicit when-not-to-use guidance or named alternatives, so it stops slightly short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aleph_get_entityA
Read-only

Fetch one entity by ID, with every populated property. Use after aleph_search to see the full record behind a hit.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesEntity ID from a search result.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint with destructiveHint false, covering safety. The description adds a concrete behavioral guarantee: the response includes every populated property, setting expectations for payload shape and completeness. No contradiction with annotations.

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?

Two concise sentences with the core action and scope front-loaded, followed by a single usage instruction. No filler or redundant restatement of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter fetch tool with annotations covering safety and a clear usage hook, nothing essential is missing. There is no output schema, but the 'every populated property' phrase gives enough return-format expectation; invalid-ID behavior is not required for correct invocation.

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 parameter description 'Entity ID from a search result.' is already clear. The tool description reinforces that the ID comes from search results but adds no new format or semantics 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Fetch'), a precise resource ('one entity by ID'), and scope ('every populated property'). The 'Use after aleph_search' hook ties it to the search workflow and distinguishes it from sibling tools like aleph_search or aleph_expand_entity, so an agent can select it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use after aleph_search to see the full record behind a hit, which gives a clear context. It doesn't mention alternatives or when not to use it, but the workflow guidance is enough for a single-purpose fetch tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aleph_get_schema_infoA
Read-only

Reference for the followthemoney data model this instance uses. Call with no argument for the list of schemata; call with a name (Person, Company, Ownership, ...) for its properties and how it links to other schemata. Use it to pick the right schema filter or expand property.

ParametersJSON Schema
NameRequiredDescriptionDefault
schemaNoSchema name, e.g. 'Person'. Omit to list all schemata.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and non-destructive annotations, the description explains what behavior to expect depending on the input: a list of schemata when omitted, and properties/links when a name is supplied. This adds return-behavior context without contradiction, though it does not cover finer details like error cases.

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?

Three sentences deliver the tool's purpose, invocation pattern, and usage context with no repetition or filler. The information is front-loaded, and each sentence contributes to the agent's ability to call the tool correctly.

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?

For a simple read-only reference tool with one optional parameter and no output schema, the description provides enough information to invoke it and understand its result shape at a high level. It might be slightly richer about the exact structure of the returned schema properties, but that is not essential for correct invocation.

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?

The schema already documents the sole parameter at 100% coverage, but the description adds meaningful context by explaining the no-argument behavior, providing example names, and tying the parameter to practical use (picking filters or expanding properties). This goes beyond the baseline schema-only value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a reference for the followthemoney data model and specifies its two calling modes: no argument lists all schemata, a schema name returns properties and links. This distinguishes it from sibling tools like aleph_get_entity or aleph_search, which operate on entities rather than the schema model itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states a clear use case: 'Use it to pick the right schema filter or expand property.' It also gives direct guidance on when to pass a schema name versus no argument. It does not explicitly name alternatives or exclusion criteria, so it falls slightly short of a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aleph_list_collectionsA
Read-only

List or search the datasets (collections) available to you — leaks, company registries, sanctions lists, court archives. Use it to discover what sources exist, then pass collection IDs to aleph_search to scope a query.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDatasets per page (1-200).
queryNoFilter datasets by name, e.g. 'Cyprus'.
offsetNoSkip this many, for paging.
categoryNoDataset category: leak, company, sanctions, court, procurement, land, gazette, news, casefile, poi, regulatory, customs, transport, finance, license, library, census, grey, other.
countriesNoTwo-letter ISO country codes.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already communicate readOnlyHint=true and destructiveHint=false, and the description is consistent with them. It adds a useful nuance that collections are 'available to you', implying permission-scoped results, but doesn't go further into pagination, result shape, or filtering behavior beyond the 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?

The description is two tight sentences with the core purpose front-loaded and a practical follow-up about using collection IDs downstream. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an optional-parameter list tool with rich schema descriptions and safety annotations, the description is complete: it states what the tool lists, what the returned IDs are for, and how this fits into a larger search workflow. No output schema exists, but the tool's return value is inferable as a list of collection objects.

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 all five parameters already have meaningful documentation. The description's category examples (leaks, company registries, sanctions lists) reinforce the category parameter but add no parameter-level detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb and resource, 'List or search the datasets (collections) available to you', and gives concrete examples of collection types. It also differentiates itself from aleph_search by framing collections as the source-discovery layer and explicitly pointing the agent to pass collection IDs to aleph_search afterward.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage context: use this tool to discover what sources exist before scoping an aleph_search query. It doesn't explicitly state when not to use it versus aleph_get_collection, but the discovery-oriented guidance is enough for most routing decisions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aleph_similar_entitiesA
Read-only

Find entities that may be the same real-world person or company as this one, across other datasets. Use it to link a subject between a leak and a company registry. Results are ranked candidates, not confirmed matches — verify with birth dates, addresses or registration numbers.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax candidates to return.
entity_idYesEntity ID to find matches for.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, open-world, and non-destructive behavior. The description adds valuable context beyond that by stating results are 'ranked candidates, not confirmed matches' and advising verification with birth dates, addresses, or registration numbers. This meaningfully informs downstream agent behavior.

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 three concise sentences with no filler. It front-loads the purpose, then gives a practical use case, and closes with an important caveat. Every sentence earns its place.

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?

There is no output schema, but the description explains that the tool returns ranked candidates rather than confirmed matches and gives verification guidance. It does not describe the exact result shape, but for a simple read-only lookup with two parameters, the provided context is largely sufficient.

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 coverage is 100% with descriptions for both parameters: 'entity_id' and 'limit'. The description only indirectly refers to entity_id as 'this one' and does not add meaningful parameter-level detail beyond the schema, so the baseline score of 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?

The description clearly states the operation ('Find') and the resource ('entities that may be the same real-world person or company as this one'), and gives a concrete use case linking a leak to a company registry. It distinguishes the tool from simple entity retrieval, but it does not explicitly contrast it with siblings like aleph_expand_entity or aleph_xref_results.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use the tool: 'Use it to link a subject between a leak and a company registry.' It also sets expectations that results are candidates, not confirmations. However, it does not state when not to use it or mention alternative sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aleph_statisticsA
Read-only

Size and shape of the Aleph instance: how many datasets and entities it holds, broken down by entity type, category and country. Use it to gauge coverage before concluding something is absent.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavior beyond this: it returns aggregate statistics rather than specific records, and it contextualizes the open-world nature by warning against concluding absence before checking coverage.

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?

Two sentences, no filler. The core capability is front-loaded, and the practical use case is stated succinctly in the second sentence. Every clause adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only statistics tool, the description is complete: it explains what the tool returns, how results are broken down, and when to invoke it. No output schema exists, but the aggregate breakdown is named, so an agent can make an informed call.

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?

The tool takes zero parameters, and schema description coverage is 100%, so there are no parameter semantics to explain. The description appropriately focuses on output semantics instead, which is the useful information for an agent selecting this tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific language—'Size and shape of the Aleph instance'—and states exactly what it returns: dataset and entity counts with breakdowns by type, category, and country. It also clearly communicates its role as a coverage-gauge tool, which distinguishes it from entity/search/collection tools among the siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use this tool: 'Use it to gauge coverage before concluding something is absent.' It does not explicitly list exclusions or name alternative tools, but the use case is distinct enough from siblings like search or entity retrieval that the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

aleph_xref_resultsA
Read-only

Read the cross-reference results already computed for a dataset: entities in it that resemble entities elsewhere in Aleph, scored and ranked. Useful for finding overlaps between your own casefile and public registries. Read-only — this does not start a new cross-reference run.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMatches per page (1-200).
offsetNoSkip this many, for paging.
collection_idYesCollection ID to read xref results for.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly says this is read-only and that it does not trigger a new cross-reference computation, which adds useful behavioral context beyond the annotations. It is consistent with the readOnlyHint and destructiveHint annotations, and no contradiction exists.

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?

Three concise sentences each earn their place: what the tool returns, when it is useful, and a behavioral caveat about not starting a new run. The main verb and resource are front-loaded.

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?

For a simple read-only paged tool, the description plus full schema covers the purpose, inputs, and side-effect profile. It could mention behavior when no cross-reference results exist, but that is a minor gap given the schema and annotations.

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?

The input schema already includes descriptions for all three parameters, including defaults and bounds for limit and offset. The description adds contextual framing about the collection but does not need to compensate for missing schema information, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read') and resource ('cross-reference results already computed'), explains what those results are (entities resembling entities elsewhere in Aleph, scored and ranked), and clarifies that this is distinct from starting a new cross-reference run. This clearly differentiates it from related sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete use case: finding overlaps between your own casefile and public registries. It also clarifies that this tool does not start a new cross-reference run. However, it does not explicitly name alternative sibling tools or state when not to use this tool.

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. 10 tool updatesv0.1.0
    • First observedaleph_expand_entity
    • First observedaleph_fetch_document_text
    • First observedaleph_get_collection
    • First observedaleph_get_entity
    • First observedaleph_get_schema_info
    • First observedaleph_list_collections
    • First observedaleph_search
    • First observedaleph_similar_entities
    • First observedaleph_statistics
    • First observedaleph_xref_results

TDQS

A4.2/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct Aleph operation: search, entity retrieval, network expansion, identity matching, collection metadata, statistics, schema lookup, xref result reading, and document text extraction. The closest pair (aleph_similar_entities and aleph_xref_results) is separated clearly by entity-level versus dataset-level scope.

Naming Consistency3/5

All tools share the aleph_ prefix and snake_case, but they do not follow one verb_noun convention: get_entity, list_collections, and fetch_document_text are verb-object, while statistics, xref_results, and similar_entities are noun/adjective phrases and search is a bare verb. Names are readable and predictable enough to navigate, but the pattern is mixed.

Tool Count5/5

Ten tools is well-scoped for an Aleph data exploration server: each tool covers a distinct read-side capability with no redundant utility tools or bloat.

Completeness4/5

The read-side investigation workflow is well covered: discover collections, search, inspect, expand, match, and read document text. However, the surface is explicitly read-only—there is no way to create or update casefile entities, write collections, or start a new cross-reference run—so it is not a full Aleph admin or casefile API.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Provides read-only access to TrustLayer's public API, enabling users to query and retrieve data about parties, documents, projects, and other TrustLayer entities through MCP-compatible tools.
    -
  • A
    license
    A
    quality
    D
    maintenance
    Read-only MCP server for exploring and searching OpenSearch clusters, enabling log analysis, index exploration, and query execution.
    8
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only interaction with Elasticsearch, supporting listing indices, retrieving mappings, and executing search/aggregation queries via MCP.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only exploration of curated foresight signals, semantic graph, themes, and horizons, allowing agents to query the map, track theme trends, and identify weak signals without modifying any data.
    MIT