criba: who is calling your MCP server
Server Details
Identify who calls your MCP server or A2A agent: declared identity vs observed behaviour.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 3 tools
classify_visitor (behaviour from request events) and identify_client (declared identity from User-Agent/clientInfo) are adjacent in topic, but the descriptions explicitly draw the line: identification is a declaration, classification is behaviour. list_known_bots is clearly the catalog lookup. A minor residual risk remains that an agent picks identify_client when it wanted a behavioural verdict, but the cross-reference mitigates it well.
All three names follow the same snake_case verb_noun pattern (classify_visitor, identify_client, list_known_bots) with unambiguous action verbs. Nouns differ (visitor/client/bots) but that reflects genuinely different entities, not inconsistent convention.
Three tools is on the thin side but defensible for a focused visitor-identification/classification service with no state to mutate. Each tool earns its place; there is no filler or redundancy.
The core read-only lifecycle is covered: declare-and-match (identify_client), observe-and-classify (classify_visitor), and enumerate the reference catalog (list_known_bots, with filtering). Minor gaps: no way to report an unknown/unlisted bot back to the catalog, no direct single-entry catalog fetch, and no batch classification across multiple distinct visitors.
Available Tools
3 toolsclassify_visitorClassify a visitorARead-onlyIdempotentInspect
Classify one visitor from its requests to your MCP server, A2A agent or website. Returns the declared identity, the observed behaviour class (acts-on-results, agent-tool-use, agent-message, probe, indexer, web-scanner, web), the signals and reasons, and mismatch=true when behaviour contradicts the declared identity. All event fields are optional; send what your server parsed. At most 500 events.
| Name | Required | Description | Default |
|---|---|---|---|
| events | Yes | One visitor's requests, in order |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: it names the returned fields (declared identity, behaviour class, signals, reasons, mismatch flag) and the 500-event cap, so the agent knows what the analysis produces. It does not explain what happens with very sparse event lists, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and its output classes, followed by input constraints. Nothing is repeated and the length matches the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of explaining return values, and it does so by listing identity, behaviour class, signals, reasons and the mismatch flag. Combined with the event-cap constraint, an agent has everything needed to invoke the tool and interpret its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, and every nested event field carries its own description, so the baseline is 3. The description still adds meaning beyond the schema by clarifying that all event fields are optional and that the caller should send whatever its server actually parsed, which tells an agent how lenient it can be when constructing input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Classify one visitor from its requests') and immediately enumerates the output classes (acts-on-results, agent-tool-use, agent-message, probe, indexer, web-scanner, web). That enumeration lets an agent distinguish this tool from the sibling list_known_bots and identify_client without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the 'one visitor' scope and the event-input instruction ('send what your server parsed'), but the description never states when to prefer this tool over identify_client, nor any exclusions or prerequisites. Guidance is adequate but remains inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
identify_clientIdentify a clientARead-onlyIdempotentInspect
Who a User-Agent and/or an MCP clientInfo.name claims to be, matched against criba's catalog of known MCP indexers, verifiers, A2A directories, AI crawlers, scanners and HTTP libraries. This is a declaration, not proof: use classify_visitor for behaviour. Pass at least one of the two.
| Name | Required | Description | Default |
|---|---|---|---|
| user_agent | No | HTTP User-Agent header | |
| client_name | No | MCP clientInfo.name sent in initialize |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered. The description adds genuinely new behavioural context beyond them: the result is a self-declared claim, not verified proof, which affects how much an agent should trust the response. It does not mention match confidence or fallback behaviour when nothing matches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose, then the trust caveat, then the sibling routing and precondition. The catalog enumeration is long but earns its place by defining the match universe.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only lookup with full schema coverage and annotations, the description covers purpose, trust level, alternative and minimum input. Without an output schema, the return shape (e.g. matched entry versus no-match) is still left implicit, which is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning: it clarifies that client_name is the MCP clientInfo.name sent in initialize and that at least one of the two optional parameters must be supplied, filling the gap left by required=0.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (identify who a User-Agent / clientInfo.name claims to be) and scopes the matching source to criba's catalog with named categories of entries. It is clearly separable from classify_visitor, which the description itself names as the behavioural counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use this tool for declared identity, use classify_visitor for behaviour. It also states the invocation constraint 'Pass at least one of the two', which is a concrete precondition rather than an inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_known_botsList known botsARead-onlyIdempotentInspect
List criba's catalog of known agent-ecosystem bots, optionally filtered by category or protocol. Each entry has its id, name, category, URL, matching rules and what it was seen doing. Catalog 2026-11-08, CC-BY-NC-4.0 (non-commercial use with attribution).
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | ||
| protocol | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered; the description adds genuinely new behavior context by describing what each entry contains (id, name, category, URL, matching rules, observed activity) and the licensing constraint (CC-BY-NC-4.0, attribution required). It stops short of covering catalog size, pagination, or whether results are cached.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences: the first defines the operation and filtering, the second defines the payload shape and the license obligation. Nothing is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on the job of describing entry fields, and it adds the non-obvious attribution requirement. The only meaningful omission for a two-filter catalog listing is whether results are paginated or bounded in size.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but both parameters are fully enumerated enums, so the value space is self-documenting. The description only names the two filters and their purpose without explaining category semantics or the interaction between category and protocol, so it partially but not fully compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List criba's catalog of known agent-ecosystem bots') plus the scope of optional filtering, so the agent knows exactly what it gets back. It does not explicitly name the siblings classify_visitor or identify_client, but the listing-vs-classifying distinction is inferable from the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage ('optionally filtered by category or protocol') but never states when to prefer this over classify_visitor or identify_client, nor any when-not conditions. An agent must infer the routing from the verbs alone.
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.
3 tool updates
- First observed
classify_visitor - First observed
identify_client - First observed
list_known_bots
Related MCP Connectors
Check an A2A agent before you delegate, or an MCP server's measured conduct. Free, no key.
Remote MCP for A2A caller identity, scope policy, verdict receipts, and audit history.
Runtime behavioral trust scoring for MCP servers. Check reliability before calling unknown tools.
MCP observability: analyse MCP server usage, investigate sessions, and instrument MCP servers.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceTracks MCP server behavior from agent-reported interactions. Provides trust scores, behavioral baselines, anomaly detection, and compliance audit exports for EU AI Act and Singapore IMDA frameworks.14 npm2MIT
- AlicenseNot gradedqualityDmaintenanceMCP Server for AI agent identity and authorization. Create, verify, and manage agent identities with trust scores and scoped authorization tokens.21 PyPIMIT
- AlicenseAqualityDmaintenanceMCP server for enterprise authentication and authorization — JWT validation, OIDC token inspection, OAuth 2.0 introspection, and role-based access control for AI agents.8MIT
- AlicenseAqualityCmaintenanceA reference MCP server that enforces identity-aware tool access using role-based permissions (Reader, Analyst, Auditor) and supports multiple identity routes like Entra RBAC, Copilot Studio, and Okta XAA. It provides read-only access to test evidence with explicit denial paths for unauthorized tools.7MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.