Skip to main content
Glama

kyb-mcp

A KYB (Know Your Business) workbench exposed over the Model Context Protocol. It searches the French company registry (SIRENE / RNE through the free recherche-entreprises.api.gouv.fr API), keeps review dossiers in PostgreSQL, and exposes all of it to Claude Code, claude.ai or any MCP client.

Built on the MCP Python SDK v2 (protocol revision 2026-07-28) as a learning project that uses every protocol primitive on purpose: tools, resources, prompts, completions, elicitation, sampling, progress, change notifications, stdio and Streamable HTTP.

┌────────────┐  stdio / Streamable HTTP  ┌──────────────────────────┐   https   ┌────────────────────────┐
│ MCP client │ ◄───────────────────────► │ kyb-mcp (MCPServer)      │ ────────► │ recherche-entreprises  │
│ Claude Code│   tools · resources ·     │  tools/  resources.py    │ 5 req/s   │ .api.gouv.fr (public)  │
│ claude.ai  │   prompts · completions   │  prompts.py  core.py     │           └────────────────────────┘
│ Inspector  │   elicit · sample ·       │  db/repo.py (port)       │   SQL     ┌────────────────────────┐
└────────────┘   progress · notify       │   ├ InMemoryDossierRepo  │ ────────► │ PostgreSQL             │
                                         │   └ PostgresDossierRepo  │           │ (Compose local / Neon) │
                                         └──────────────────────────┘           └────────────────────────┘

Quick start

uv sync
uv run kyb-mcp                     # stdio server, in-memory dossiers, no config needed
uv run mcp dev src/kyb_mcp/server.py   # same server inside the MCP Inspector (needs Node)

Register it in Claude Code (stdio):

claude mcp add kyb -- uv run --directory /absolute/path/to/kyb-mcp kyb-mcp

Then try: "Find the company Qonto, open a dossier for it and run the KYB review prompt."

Related MCP server: France Data MCP

What the server exposes

Primitive

Name

What it teaches

Tool

search_companies, get_company, find_by_person

Typed inputs (Annotated + Field), structured output from pydantic models, ToolError for model-recoverable failures, read_only_hint

Tool

create_dossier, add_note, set_status, list_dossiers, get_dossier

Lifespan-held store, list_changed / resource_updated notifications, mutation annotations

Tool

archive_dossier

Elicitation through a Resolve(...) dependency returning Elicit(...); accept / decline / cancel branches

Tool

draft_risk_summary

Sampling: Resolve(...) returning Sample(...), result stored as an ai_summary note

Tool

bulk_check

ctx.report_progress, cooperative cancellation, rate-limit-aware loops

Resource

company://{siren}, dossier://{id}, dossiers://{status}, naf://{code}, naf://sections

URI templates, application/json payloads, ResourceNotFoundError

Prompt

kyb_review, compare_companies

Multi-message prompts with an EmbeddedResource attached

Completion

siren arguments

Server-side autocomplete fed by recently seen companies

All tool calls to the registry go through one httpx.AsyncClient with a token bucket (5 req/s, the public limit is 7) and a 60 s cache. Directors' birth dates are dropped before anything leaves the process.

Configuration

Variable

Default

Purpose

DATABASE_URL

unset → in-memory

PostgreSQL DSN for durable dossiers

KYB_ALLOWED_HOSTS

localhost only

Host allowlist for HTTP behind a real hostname (comma-separated)

KYB_ALLOWED_ORIGINS

none

Browser origins (CORS twin)

KYB_REQUEST_STATE_KEY

per-process random

Shared key for multi-instance HTTP (elicitation / sampling retries)

KYB_API_RATE_PER_SECOND

5

Upstream rate limit

VERCEL / KYB_BEHIND_TRUSTED_PROXY

unset

Disable DNS-rebinding checks when the proxy owns Host

Streamable HTTP, Docker, Compose

uv run uvicorn kyb_mcp.http:app --port 8000          # http://127.0.0.1:8000/mcp  (+ /healthz)
claude mcp add --transport http kyb-http http://127.0.0.1:8000/mcp

docker compose up -d --build                         # PostgreSQL 16 (host port 5433) + server on :8000

Tagged releases publish ghcr.io/igitscor/kyb-mcp with an SBOM and provenance attestation (.github/workflows/image.yml).

Deploy (Vercel Hobby + Neon, no credit card)

  1. npm i -g vercel@latest && vercel login with your personal account, then vercel link.

  2. Create a free Neon project and add its DSN: vercel env add DATABASE_URL production.

  3. vercel env add KYB_REQUEST_STATE_KEY production with python -c "import secrets; print(secrets.token_hex(32))".

  4. vercel deploy --prod. The entrypoint is kyb_mcp.http:app (see [tool.vercel] in pyproject.toml).

  5. Point Claude Code at https://<project>.vercel.app/mcp, or add it as a claude.ai custom connector.

Why this host and database: ADR 0004.

Development

uv run pytest                                        # 23 offline tests (respx mocks the registry)
docker compose up -d db && KYB_TEST_DATABASE_URL=postgresql://kyb:kyb@localhost:5433/kyb uv run pytest tests/test_repo_postgres.py
uv run ruff check && uv run ruff format --check && uv run pyright

CI runs the same on every push with a PostgreSQL service container, then builds the Docker image and smoke-tests /healthz and server/discover.

Design notes

  • ADR 0001: why SDK v2 / protocol 2026-07-28, and what changed from FastMCP.

  • ADR 0002: PostgreSQL behind a repository port, in-memory adapter for zero-setup runs.

  • ADR 0003: stateless HTTP, DNS-rebinding protection, shared request-state key.

  • ADR 0004: hosting comparison and the no-card constraint.

  • SECURITY.md: data handling, transport exposure, what is not protected yet.

Learning path (how this repo was built)

Stage

Files

Concepts

1

api/, tools/companies.py

stdio, tools/list, tools/call, structured output, errors

2

resources.py, prompts.py

URI templates, MIME types, embedded resources, completions

3

db/, tools/dossiers.py

lifespan, typed Context[AppContext], change notifications

4

tools/dossiers.py

elicitation and sampling via Resolve, progress, cancellation

5

tests/

in-memory Client(mcp), callbacks as capability declarations

6

http.py, Dockerfile, compose.yaml

Streamable HTTP, transport security, containers

7

vercel.json, pyproject.toml [tool.vercel]

serverless deployment, Neon

Next steps

  • OAuth 2.1 resource server (AuthSettings + TokenVerifier) before exposing write tools publicly.

  • OpenTelemetry exporter: the SDK already emits a span per request; add opentelemetry-sdk and an OTLP endpoint.

  • Publish to the official MCP Registry with mcp-publisher.

License

MIT. Registry data is public data from INSEE / INPI under the Licence Ouverte 2.0.

Available Tools

11 tools
add_noteAdd a noteA

Append a note to a dossier.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesFinding, question or decision
dossier_idYesDossier id as returned by create_dossier, e.g. 'd_3f9a1c2b7e4d'

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesOpaque dossier id, e.g. 'd_3f9a1c2b7e4d'
notesNoOldest first
sirenYes
statusYes
created_atYes
updated_atYes
company_nameYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already indicate this is a write operation (readOnlyHint=false) and non-destructive (destructiveHint=false), so the description does not need to restate those. The word 'Append' adds a useful nuance that the note is added to existing content rather than replacing it, but the description provides no further behavioral context such as response shape or side effects.

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, efficient sentence with no filler or redundant restatement. It front-loads the key action and object, making it easy for an agent to parse quickly.

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 two-parameter tool with a complete schema and an output schema, the description is largely adequate. The only noticeable gap is the lack of usage guidance relative to sibling tools, but the low complexity means the core information needed to invoke the tool is present.

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 the schema already documents both parameters. The description does not add meaningful parameter semantics beyond the schema; it vaguely maps to 'body' being the note content, but no extra detail is provided.

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 uses a specific verb ('Append') and resource ('a dossier'), clearly indicating the tool adds a note to an existing dossier. This distinguishes it from sibling tools like set_status, archive_dossier, or draft_risk_summary, which perform different actions.

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

Usage Guidelines2/5

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

The description gives no explicit guidance on when to use this tool versus alternatives, nor does it state any exclusions or prerequisites. Usage is only implied by the tool name and generic action phrase; there is no mention of when a note is appropriate compared to creating a dossier or drafting a risk summary.

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

archive_dossierArchive dossierA
DestructiveIdempotent

Archive a dossier after the user confirms in their client.

ParametersJSON Schema
NameRequiredDescriptionDefault
dossier_idYesDossier id as returned by create_dossier, e.g. 'd_3f9a1c2b7e4d'

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

The annotations already declare destructiveHint=true and idempotentHint=true, so the description's main added value is the 'after the user confirms' precondition, which signals that this is a user-gated destructive action. No contradiction with annotations 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?

A single sentence with no filler. It front-loads the action and immediately states the essential precondition, making every word earn 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 one-parameter tool with rich annotations and an output schema, the description is sufficient. It could theoretically elaborate on what 'archiving' changes, but the low complexity, the user-confirmation precondition, and the existing structured metadata make the definition complete enough 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 dossier_id parameter is already well documented in the schema with a source ('returned by create_dossier') and an example. The description adds no additional parameter meaning, 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.

Purpose5/5

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

States a specific verb ('Archive') and a specific resource ('a dossier'), and adds a workflow condition ('after the user confirms in their client'). The verb clearly distinguishes it from sibling tools like get_dossier, list_dossiers, and create_dossier.

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?

Provides clear context: the tool should only be used after the user has explicitly confirmed in their client. It does not explicitly name alternatives or state when not to use it, but the precondition is unambiguous and adequate for this simple operation.

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

bulk_checkBulk check SIRENsA
Read-only

Look up many SIRENs at once, reporting progress. Respects the registry rate limit (~5/s).

ParametersJSON Schema
NameRequiredDescriptionDefault
sirensYesUp to 50 SIRENs

Output Schema

ParametersJSON Schema
NameRequiredDescription
foundYes
failedYesSIRENs that errored (rate limit, timeout); retry later
missingYesSIRENs not in the registry

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds valuable behavioral context: progress reporting and respect for the registry rate limit (~5/s). These details go beyond what annotations or schema provide.

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 short sentences with no filler. The core purpose is front-loaded, and the rate-limit note is a worthwhile addition that earns its place.

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 bulk lookup with readOnlyHint=true and an output schema, the description covers the essential operational facts: bulk behavior, progress reporting, and rate limiting. Nothing critical 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 coverage for the single parameter is 100%, so the baseline is 3. The description says 'many SIRENs,' which echoes the schema's array-of-sirens design but adds no new parameter-level meaning.

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 states a specific action ('Look up many SIRENs at once') with a defined resource and scope. The 'many at once' phrasing distinguishes it from single-lookup siblings like get_company.

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 conveys when to use the tool: when many SIRENs need to be checked in one operation. It does not explicitly name an alternative for single lookups, but the context is clear enough.

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

create_dossierOpen a dossierB

Open a KYB dossier for a company. Verifies the SIREN exists in the registry first.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoWhy this review was opened
sirenYes9-digit SIREN of the company to review

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesOpaque dossier id, e.g. 'd_3f9a1c2b7e4d'
notesNoOldest first
sirenYes
statusYes
created_atYes
updated_atYes
company_nameYes

TDQS

B3.3/5.0
Behavior3/5

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

The description adds a useful behavioral detail: the SIREN is verified against the registry first, implying an error path if it does not exist. However, it does not disclose whether opening creates a new dossier, what happens if one already exists, or what side effect the optional note has, and the annotations are all false and provide little 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 short sentences: the first states the action and resource, the second adds a meaningful precondition. There is no filler or redundant repetition of the schema.

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 small parameter set, full schema coverage, and presence of an output schema, the description is minimally usable. However, it leaves the state-change semantics and sibling-tool routing underspecified, so it is not fully complete for an agent operating without extra context.

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 the schema already documents both parameters. The description only reinforces the role of siren via the registry verification and adds no new semantics for the note parameter.

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 action ('Open') and resource ('a KYB dossier for a company'), and adds a concrete verification step. It is distinguishable from siblings by name and wording, though it does not explicitly contrast itself with tools like get_dossier or list_dossiers.

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

Usage Guidelines2/5

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

No guidance is given about when to use this tool versus its siblings. It does not mention that get_dossier should be used to read an existing dossier or that search_companies might be needed to find a SIREN first; the only implied context is the registry-existence check.

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

draft_risk_summaryDraft risk summaryA

Ask the client's own model for a first-draft risk summary and store it as an AI note.

Requires a client that supports sampling. The draft is a starting point for the analyst, never a decision.

ParametersJSON Schema
NameRequiredDescriptionDefault
dossier_idYesDossier id as returned by create_dossier, e.g. 'd_3f9a1c2b7e4d'

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesOpaque dossier id, e.g. 'd_3f9a1c2b7e4d'
notesNoOldest first
sirenYes
statusYes
created_atYes
updated_atYes
company_nameYes

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses important behaviors beyond the annotations: it stores an AI note (a side effect), depends on client sampling support, and produces only a draft that should not be treated as a decision. These details meaningfully augment the all-false 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?

The description is compact and front-loaded: the first sentence states the action, the second gives a prerequisite, and the third clarifies the appropriate use. Every sentence adds value without redundancy.

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 one fully documented parameter, an output schema, and a description covering purpose, side effect, prerequisite, and limitation, the tool is nearly complete. It could be slightly stronger by explicitly noting what to do if the client lacks sampling support, but no critical information 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%, and the dossier_id parameter is already well documented with its origin and an example. The tool description adds no additional parameter-specific meaning, so the baseline of 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 names a specific verb and resource: 'Ask the client's own model for a first-draft risk summary and store it as an AI note.' This clearly distinguishes it from generic sibling tools like add_note or get_dossier by describing a unique AI-assisted workflow.

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 gives clear context and a prerequisite: 'Requires a client that supports sampling,' and frames the output as 'a starting point for the analyst, never a decision.' It does not explicitly name alternatives, but the context is sufficient to guide appropriate use.

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

find_by_personFind companies by personA
Read-onlyIdempotent

Companies where a person is listed as a director or elected official (dirigeant / élu).

Registry matching is by name only; a common name returns homonyms. Treat hits as leads to confirm, never as proof of identity.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
last_nameYesDirector's family name
first_namesNoGiven name(s) to narrow the match
only_activeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
totalYesTotal matching companies across all pages
resultsYes
per_pageYes
total_pagesYes

TDQS

A4/5.0
Behavior4/5

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

The annotations already declare readOnly, idempotent, and open-world behavior. The description adds valuable non-obvious behavioral context: matching is by name only, common names return homonyms, and results should be treated as leads rather than proof of identity.

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 brief and front-loaded: purpose first, then matching limitations, then interpretation guidance. Every sentence earns its place without repeating schema defaults or annotation hints.

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?

Given the readOnly/idempotent annotations and the presence of an output schema, the description covers the essential semantics: what entities are returned, how matching works, and how to interpret the results. It leaves only_active and pagination details to inference, but those are reasonably self-evident from parameter names and defaults.

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 schema documents last_name and first_names, and the description adds the key nuance that matching is name-only, which affects how those parameters behave. However, it does not explain only_active or page semantics, so with 50% schema coverage it only partially compensates for undocumented parameters.

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 purpose: find companies where a person is listed as a director or elected official, with French equivalents for precision. This clearly distinguishes it from siblings like search_companies, which presumably search by company rather than by person.

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 intended use case is implied by the title and description, and the homonym caveat tells the agent how to treat results. However, there is no explicit when-to-use versus when-not-to-use guidance or routing to alternatives such as search_companies.

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

get_companyGet companyA
Read-onlyIdempotent

Full registry record for one company: identity, head office, directors, latest financials.

ParametersJSON Schema
NameRequiredDescriptionDefault
sirenYes9-digit SIREN, spaces allowed

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYesRegistered name (nom_complet)
sirenYes9-digit legal unit identifier
statusYes'active' or 'ceased' (etat_administratif)
hq_cityNo
categoryNoPME / ETI / GE
hq_siretNo
naf_codeNoMain activity code (NAF/APE), e.g. 62.01Z
directorsNo
created_onNoCreation date, YYYY-MM-DD
financialsNoMost recent year first
hq_addressNo
last_updatedNoRegistry last update timestamp
headcount_bandNoINSEE tranche_effectif_salarie code
hq_postal_codeNo
legal_form_codeNoINSEE nature_juridique code, e.g. 5710 = SAS
establishments_openNoNumber of open establishments

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already establish readOnly, idempotent, and open-world behavior, and the description does not contradict them. The description adds minimal behavioral context beyond that, such as the kind of data included, but it does not reveal potential gaps like missing financials or record currency.

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?

One concise sentence with a front-loaded scope and a clear list of record components. There is no redundant wording, and every part of the description contributes to understanding what the tool returns.

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 single-parameter lookup with an output schema and read-only/idempotent annotations, the description is nearly sufficient. The only gap is that it does not explicitly route the agent away from searching when the SIREN is unknown, but the schema and example make the required input clear.

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 fully documents the only parameter, siren, including format and an example. The description adds no extra semantic detail about the parameter, so the baseline of 3 is appropriate since the schema carries the meaning.

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 identifies the resource: a single company's full registry record, with a concrete scope (identity, head office, directors, latest financials). It implies a lookup-by-identifier tool and is distinct from the sibling search_companies, but it does not explicitly contrast itself with those siblings.

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 phrase "for one company" implies this is the right tool when an agent already has a specific company identifier and needs the full record rather than a search. It does not explicitly state when to prefer this over search_companies or find_by_person, so guidance is only implied.

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

get_dossierGet dossierA
Read-only

One dossier with all its notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
dossier_idYesDossier id as returned by create_dossier, e.g. 'd_3f9a1c2b7e4d'

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesOpaque dossier id, e.g. 'd_3f9a1c2b7e4d'
notesNoOldest first
sirenYes
statusYes
created_atYes
updated_atYes
company_nameYes

TDQS

A3.5/5.0
Behavior3/5

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

The description adds a behavioral trait beyond the annotations: the result includes 'all its notes.' The readOnlyHint already covers safety, so the added note-scope detail is useful context. However, it does not disclose any potential edge cases or return characteristics beyond that single trait.

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?

The description is five words with no filler, and the key differentiator ('with all its notes') is front-loaded. It is terse but earns its place by adding scope information beyond the tool's name. It could be slightly more explicit, but it is appropriately concise.

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 single-parameter getter with a complete input schema, a readOnly annotation, and an output schema, the minimal description is largely sufficient. It does not explain the return format, but that is covered by the output schema. The only missing element is explicit comparison with list_dossiers, which is more of a usage-guidance concern.

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 description says nothing about the dossier_id parameter, but the input schema provides 100% coverage with a clear title, description, and an example value. Since the schema fully documents the only parameter, the baseline 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 identifies the resource—a single dossier—and adds a distinguishing detail: it includes all notes. This separates it from list_dossiers (plural) and from sibling tools targeting other entities like get_company. It relies on the title for the verb 'Get' and doesn't mention lookup by ID, but the resource and scope are clear.

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?

No explicit usage guidance is provided. The singular wording implies this tool is for fetching one specific dossier, contrasting with list_dossiers, but it does not state when to prefer it or exclude alternatives. There are no direct comparisons or 'use when' instructions.

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

list_dossiersList dossiersA
Read-only

Dossiers most recently updated first.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by status; omit for all

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true, so the safe read behavior is covered. The description adds the 'most recently updated first' ordering, which is a behavioral trait not present in structured fields. It does not contradict the annotations and provides useful sorting context.

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 entire description is six words and contains no filler or repeated schema information. It front-loads the only non-obvious behavior (ordering). It is perhaps terse but not wasteful.

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 list with one optional parameter, the description plus schema and annotations are nearly sufficient. The description covers ordering, the schema covers the status filter, and annotations cover safety. It does not mention pagination or explicit 'all dossiers' scope, but the output schema and simplicity limit the gap.

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 single optional status parameter is fully documented in the schema with 'Filter by status; omit for all' and an enum of acceptable values. Since schema_description_coverage is 100%, the description does not need to add parameter detail. The tool description adds no additional parameter semantics, 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?

The description 'Dossiers most recently updated first' conveys the result ordering but does not explicitly state an action; the title 'List dossiers' supplies the verb and resource. It distinguishes the tool from get_dossier by plural scope, but not explicitly from listing/searching alternatives. This is clear but not maximally specified.

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

Usage Guidelines2/5

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

There is no statement about when to use list_dossiers instead of get_dossier, search_companies, or create_dossier. The ordering information implies a read-only list use, but no exclusions or alternative routing are given.

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

search_companiesSearch companiesA
Read-onlyIdempotent

Search French companies, associations and public bodies in the official registry (SIRENE/RNE).

Returns a page of summaries with SIREN, status, activity, head office and headcount band.
Use `get_company` on a SIREN for directors and financials.
ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
queryYesCompany name, brand, SIREN/SIRET or address words
naf_codeNoMain activity code, e.g. '62.01Z'
per_pageNo
departmentNoDépartement code, e.g. '75' or '2A'
only_activeNoExclude ceased companies
postal_codeNoFilter on a 5-digit postal code

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
totalYesTotal matching companies across all pages
resultsYes
per_pageYes
total_pagesYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and open-world behavior, so the description only needs to add operational context. It adds the registry source and the exact summary fields returned (SIREN, status, activity, head office, headcount band). It does not detail pagination behavior or sorting, but that is partially represented by page/per_page in 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?

Two sentences with no filler: the first states scope and source, the second states return contents and a pointer to the logical next tool. Information is front-loaded and each sentence earns its place.

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 search tool with an output schema, rich annotations, and schema-documented filtering parameters, the description covers the necessary context: what is searched, where, what is returned, and when to switch to get_company. Nothing critical is missing for an agent to select and invoke the tool correctly.

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 71%, and the schema already explains query, naf_code, department, only_active, and postal_code. The description adds no parameter-level meaning beyond the schema, and page/per_page are not explicitly described in either, though their names/defaults make them predictable.

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 and resource: 'Search French companies, associations and public bodies in the official registry (SIRENE/RNE).' It also disambiguates from a key sibling by directing SIREN-based detail lookups to get_company, so the agent can distinguish it from sibling tools without opening schemas.

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

Usage Guidelines5/5

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

The final sentence provides an explicit alternative and condition: 'Use get_company on a SIREN for directors and financials.' This tells the agent when to switch from this summary-search tool to a more detailed tool, which satisfies the when-to-use/alternative guidance.

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

set_statusSet dossier statusB
Idempotent

Move a dossier through the review workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoRecorded as a system note
statusYesopen, in_review, approved or rejected (archive via archive_dossier)
dossier_idYesDossier id as returned by create_dossier, e.g. 'd_3f9a1c2b7e4d'

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesOpaque dossier id, e.g. 'd_3f9a1c2b7e4d'
notesNoOldest first
sirenYes
statusYes
created_atYes
updated_atYes
company_nameYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and idempotentHint=true, covering the mutation and retry-safety profile. The description adds useful workflow context beyond the annotations, but it does not disclose behavioral details like allowed transitions, whether any status change can be undone, or what side effects occur beyond the status update. No contradiction with annotations exists.

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?

The description is a single, front-loaded sentence with no filler or redundancy. It is concise and immediately communicates the tool's role, though it is slightly minimal and could carry a bit more guidance without becoming verbose.

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 schema covers all parameters, includes an enum for status, and an output schema exists, so the call shape is well defined. What is missing is explicit guidance about when this tool is appropriate versus archive_dossier and what workflow constraints apply. For a simple status-transition tool, the description is adequate but not rich.

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 the schema already documents dossier_id, status, and reason. The description itself adds no parameter-level meaning beyond framing the action as a workflow move, which is sufficient given the full schema coverage. Baseline 3 is appropriate.

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 action ('Move a dossier') and a clear resource/domain ('review workflow'), so an agent understands this updates a dossier's status. It does not explicitly enumerate the statuses or fully distinguish itself from archive_dossier, but the workflow framing makes the core purpose clear.

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 phrase 'through the review workflow' implies this tool is for status transitions such as open, in_review, approved, or rejected. However, there is no explicit 'use when' or 'do not use for archiving' guidance in the description; the archive_dossier exclusion only appears in the schema's status parameter description, not in the tool description.

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. Dates show when Glama detected each change.

  1. 11 tool updatesv0.1.0
    • First observedadd_note
    • First observedarchive_dossier
    • First observedbulk_check
    • First observedcreate_dossier
    • First observeddraft_risk_summary
    • First observedfind_by_person
    • First observedget_company
    • First observedget_dossier
    • First observedlist_dossiers
    • First observedsearch_companies
    • First observedset_status

TDQS

A3.9/5.0
Disambiguation5/5

Each tool targets a distinct resource or action: registry lookup (search, get, find, bulk) is clearly separated from dossier workflow (create, list, get, note, status, archive, draft). No two tools overlap meaningfully, and the descriptions reinforce the boundaries.

Naming Consistency4/5

Names are uniformly snake_case and mostly follow a verb_noun pattern (get_company, create_dossier, list_dossiers, archive_dossier). Minor deviations like find_by_person and bulk_check are still predictable and do not harm usability.

Tool Count5/5

11 tools is well-scoped for a KYB server: registry research and dossier management each get enough coverage without redundancy. Every tool serves a clear step in the workflow.

Completeness4/5

The toolset covers the core KYB lifecycle: company research, dossier creation, note-taking, status progression, and archival. Minor gaps such as no delete/unarchive or document attachment are workable for the apparent domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables interaction with Datagouv APIs, primarily allowing users to search for up-to-date information about companies registered in France.
    11
    -
  • A
    license
    A
    quality
    A
    maintenance
    France Data MCP lets AI agents query, cross-reference and automatically enrich multiple French public registries through a unified MCP interface. France Data MCP provides a French territorial intelligence layer designed for multi-source reasoning and agentic orchestration.
    36
    766
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server covering French law via the PISTE platform: 8 tools wrapping the JUDILIBRE API (open data judicial decisions from Cour de cassation, courts of appeal and civil courts).
    2
    AGPL 3.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    MCP server to query the INSEE SIRENE API and search for French companies, supporting searches by SIREN, SIRET, and advanced filters like name, location, and activity.
    1
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/iGitScor/kyb-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server