factreason
OfficialFactReason is an MCP server providing verified, Ed25519-signed reference data for AI agents before writing code. Tools:
Dependency upgrade advisories (
factreason_package_upgrade_advisory): breaking changes between npm/PyPI versions (yanked releases, exports, CJS/ESM, runtime/peer deps, licence) with before/after evidence.API breaking changes (
factreason_api_breaking_changes): what breaks between two versions of a third-party API.API schema lookup (
factreason_api_schema): exact request/response shape for an endpoint/version.Integration brief (
factreason_integration_brief): base URL, auth, required params, body, response codes for one call.API discovery (
factreason_discover_api): find which of 1,097+ services can perform a capability.Deprecation scan (
factreason_deprecation_scan): deprecated endpoints/params, sunset dates, replacements.Auth playbook (
factreason_auth_playbook): auth schemes, scopes, rate-limit headers, error codes.Component specs (
factreason_component_spec): pinouts, voltages, packages, alternatives by part number/search.Spec change subscriptions (
factreason_subscribe_spec_changes): webhook notifications when API specs change.Credit top-ups (
factreason_create_topup_link): Stripe checkout link to add prepaid credit when balance low or HTTP 402.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@factreasonwhat breaks if I upgrade chalk from 4.1.2 to 5.0.0?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Stop an agent shipping a broken dependency upgrade
Your agent wants to bump chalk from 4.1.2 to 5.0.0. Before it edits package.json, it asks what breaks:
GET /api/v1/packages/npm/chalk/advisory?from=4.1.2&to=5.0.0
Authorization: Bearer <key>{
"found": true,
"packageName": "chalk",
"fromVersion": "4.1.2",
"toVersion": "5.0.0",
"breakingCount": 2,
"advisories": [
{
"severity": "breaking",
"changeType": "MODULE_FORMAT_CHANGED",
"description": "chalk 5.0.0 changed module format from \"commonjs (undeclared)\" to \"module\". CommonJS require() of this package will now fail.",
"evidenceField": "type",
"evidenceBefore": null,
"evidenceAfter": "module",
"migrationHint": "Convert the call site to import(), or pin to the last CommonJS release."
},
{
"severity": "breaking",
"changeType": "RUNTIME_REQUIREMENT_RAISED",
"description": "chalk 5.0.0 raised its runtime requirement from \">=10\" to \"^12.17.0 || ^14.13 || >=16.0.0\". Older runtimes are no longer supported.",
"evidenceField": "engines.node",
"evidenceBefore": ">=10",
"evidenceAfter": "^12.17.0 || ^14.13 || >=16.0.0",
"migrationHint": "Confirm the deployment runtime satisfies the new floor before upgrading."
}
]
}Via MCP, the same question is one tool call:
{
"name": "factreason_package_upgrade_advisory",
"arguments": { "registry": "npm", "name": "chalk", "from": "4.1.2", "to": "5.0.0" }
}Set responseFormat: "compact" on supported heavy MCP tools to remove repeated fields and prose while retaining the facts an agent needs. Package advisories preserve evidenceField, evidenceBefore, evidenceAfter, and migrationHint. Each compact response includes tokenMetrics counted with o200k_base. The default remains full for compatibility, and compact output never bypasses authorization or changes the query price.
Token savings vary with the response. Metrics count one exact JSON structuredContent payload and include the tokenMetrics object itself; the matching text block remains for MCP clients that do not consume structured content yet. The private application repository also carries a repeatable npm run benchmark:tokens fixture so published claims can be checked before release.
Every finding carries evidenceField, evidenceBefore and evidenceAfter — the exact registry metadata field and its values either side of the change. An agent can verify the claim against npm or PyPI directly rather than taking our word for it.
An agent can call factreason_create_key to get its own key instantly — no human, no card, no signup. The returned key must then be added to the MCP connection as an Authorization: Bearer header and the client reconnected before retrying a paid tool; tool output cannot rewrite the current transport header. Eligible new users may receive up to $0.05 of one-off trial credit, subject to grant budgets and spent at the published per-tier prices — up to about two advisory lookups, or fifty component lookups. Successful advisory lookups after that cost $0.02 per query. Misses are never billed and never consume trial credit. Wallet-equipped agents can pay the 402 challenge directly with x402 on Base.
Related MCP server: Ecosyste.ms Package Data
Connect
Streamable HTTP. No install, no package to pull.
{
"mcpServers": {
"factreason": {
"type": "http",
"url": "https://factreason.com/mcp"
}
}
}Manifest: /.well-known/mcp.json
Human quickstart and workflow guidance: /docs. Agents can fetch the same material as Markdown from /docs.md or use the complete index at /llms-full.txt.
The container/stdio bridge accepts an optional FACTREASON_API_KEY environment variable and forwards it as a Bearer
credential to the same live endpoint. Tool discovery works without a key; metered lookups return HTTP 402 when neither
a key nor a valid x402 payment is supplied.
Get a key — no signup, no card:
curl -X POST https://factreason.com/api/v1/keys/create \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com"}'Tools
Tool | What it answers |
| What breaks between two published npm/PyPI versions |
| Create a key; then add it to the MCP connection header and reconnect |
| Exact request/response shape of an API endpoint at a version |
| What breaks between two versions of a third-party HTTP API |
| Everything needed to write one working call to an API |
| Which of 1,097 services can do X |
| Which endpoints are deprecated, sunset dates, replacements |
| Auth schemes, scopes, rate-limit headers, error-code table |
| Electronics component pinouts, voltages, packages |
| Webhook or polling callback when a spec changes |
| Stripe checkout link when credit runs out |
Proof-of-Fact Signatures
Successful REST data responses and MCP tool-call responses are signed by our Ed25519 private key:
X-Warehouse-Proof-Signature: Ed25519 signature of the response payloadX-Fact-Public-Key-Id: Stable signing key identifierX-Fact-Signature-Alg:EdDSA
Public keys are published and rotated via JWKS at https://factreason.com/.well-known/jwks.json.
Licence & Contact
MIT. Attribution requirement for APIs.guru source data: CC-BY 4.0.
Questions, support, or data reports: hello@factreason.com.
Available Tools
10 toolsfactreason_api_breaking_changesARead-onlyIdempotentInspect
Temporarily unavailable for third-party APIs while stored comparisons are revalidated; calls return an unbilled status and alternatives. When restored, this compares optional from/to API versions and returns removed endpoints, parameter changes, and migration notes. Use factreason_package_upgrade_advisory for npm or PyPI packages.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Third-party API service, e.g. "Stripe" or "OpenAI" | |
| toVersion | No | Optional exact version being evaluated | |
| fromVersion | No | Optional exact version currently targeted |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | No | |
| billed | No | |
| changes | No | |
| meaning | No | |
| message | No | |
| service | No | |
| suggestion | No | |
| changeCount | No | |
| alternatives | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses the temporary unavailability and that calls will return an unbilled status and alternatives. This is important behavioral context not captured elsewhere. It also outlines future behavior, enhancing transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, two sentences, and both sentences contribute valuable information: the current temporary state and the core functionality with an alternative reference. It is front-loaded with the most urgent caveat and structured logically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and rich annotations, the description provides sufficient context: it explains the temporary state, the comparison logic, and the type of results. It also covers the alternative for packages. No critical gaps are evident for a read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters with full coverage, so the baseline is 3. The description adds minimal extra meaning, only clarifying that from/to versions are optional and used for comparison. This is marginal but not beyond what schema descriptions already convey.
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 clearly states the tool compares optional from/to API versions and returns specific outputs (removed endpoints, parameter changes, migration notes). It also distinguishes itself from the sibling factreason_package_upgrade_advisory, making its purpose unambiguous.
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?
It explicitly directs users to use factreason_package_upgrade_advisory for npm/PyPI packages, which is a clear alternative. It also notes the temporary unavailability, giving context on current usage expectations. However, it doesn't explicitly state when to use this tool beyond implicit third-party API scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factreason_api_schemaARead-onlyIdempotentInspect
Search exact request and response schemas for third-party API endpoints. Pass service alone to list its indexed endpoints, add query to narrow by path or operation, or use query alone across services; returns matches or nearest services. Uses metered access and does not modify source data. Prefer factreason_integration_brief for one callable request.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional endpoint path or operation, e.g. "payment_intents" | |
| service | No | Optional service filter, e.g. "Stripe" |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| found | No | |
| message | No | |
| results | No | |
| totalMatched | No | |
| nearestServices | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds two useful behaviors beyond that: 'Uses metered access' (cost/rate-limit implication) and 'returns matches or nearest services' (fuzzy fallback). This extra context helps an agent anticipate side effects and output behavior without contradicting 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct job: purpose, usage modes, and behavior plus alternative. No fluff, no repetition of schema field names. The most important information is front-loaded, and the alternative recommendation is strategically placed at the end.
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 read-only search tool with a rich output schema and full annotations, the description covers all necessary aspects: what it searches, how to invoke it in three modes, the metered-access caveat, and a pointer to an adjacent tool. The existence of an output schema means return-value details need not be spelled out, and the description does not attempt to over-explain.
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?
The input schema already documents each parameter individually, and coverage is 100%. The description goes further by explaining parameter combinations: 'Pass service alone to list its indexed endpoints, add query to narrow by path or operation, or use query alone across services.' This clarifies how the two optional parameters interact, which is not evident from the schema alone.
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 opens with a specific verb-resource pairing: 'Search exact request and response schemas for third-party API endpoints.' It immediately clarifies the tool's scope (schemas, not code or documentation) and distinguishes it from the sibling tool factreason_integration_brief by explicitly recommending that tool for 'one callable request.' The usage modes (service alone, query narrows, query alone) further sharpen the purpose.
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 gives concrete usage scenarios: 'Pass service alone to list its indexed endpoints, add query to narrow by path or operation, or use query alone across services.' It also names an alternative tool ('Prefer factreason_integration_brief for one callable request'), providing a clear when-to-use-this-over-that rule. However, it does not mention other sibling tools like factreason_discover_api or factreason_api_breaking_changes, so coverage of alternatives is not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factreason_auth_playbookARead-onlyIdempotentInspect
Get publisher-declared authentication schemes, scopes, rate-limit headers, and error codes for one third-party API. Returns a structured playbook or nearest service suggestions, and marks undocumented details as unstated rather than guessing. Uses metered access. Prefer factreason_integration_brief when assembling a complete API call.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Third-party API service, e.g. "Stripe", "Twilio", or "Cloudflare" |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | No | |
| compact | No | |
| message | No | |
| playbook | No | |
| nearestServices | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description adds valuable behavioral details: 'Uses metered access' warns of cost/rate implications, and 'marks undocumented details as unstated rather than guessing' communicates honest fallback behavior. It also mentions returning 'nearest service suggestions' when the exact service is not found, which is useful context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, each serving a purpose: the first states the core function, the second explains the return behavior, and the third gives alternative guidance. It is front-loaded and free of unnecessary detail, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter), the presence of an output schema, clear annotations, and explicit alternative guidance, the description provides sufficient context for an agent to select and invoke the tool correctly. It covers purpose, behavior, usage, and fallbacks without being overly verbose.
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?
The input schema has 100% description coverage for the single parameter 'service', including examples. The description does not add additional parameter meaning beyond what the schema already provides, so a baseline score of 3 is appropriate.
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 clearly states the tool's purpose with a specific verb and resource: 'Get publisher-declared authentication schemes, scopes, rate-limit headers, and error codes for one third-party API.' It differentiates from the sibling tool factreason_integration_brief by noting that the latter is preferred for assembling complete API calls, making the scope explicit.
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 provides clear context for when to use this tool (when authentication details are needed) and explicitly names an alternative (factreason_integration_brief for complete API calls). However, it does not exhaustively contrast with other sibling tools like factreason_api_schema or factreason_discover_api, leaving some ambiguity for edge cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factreason_component_specARead-onlyIdempotentInspect
Look up electronics component pin assignments, voltage range, package, and alternatives. Pass exact partNumber for one component or query for a capability search; partNumber takes precedence if both are supplied. For exact lookups, set responseFormat="compact" for tokenizer-measured context savings; the backward-compatible default is "full". Uses metered access and returns matches or suggestions. Confirm critical values against the manufacturer datasheet.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Free-text capability search, e.g. "3.3V ARM MCU with SPI" | |
| partNumber | No | Exact part number, e.g. "STM32F401RE" | |
| responseFormat | No | Use compact for an exact part lookup; full preserves the legacy data response | full |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| hint | No | |
| found | No | |
| compact | No | |
| message | No | |
| results | No | |
| partNumber | No | |
| provenance | No | |
| qualityScore | No | |
| tokenMetrics | No | |
| totalMatched | No | |
| nearestMatches | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint true, but the description adds valuable behavioral context: metered access, returns matches or suggestions, and a caveat to confirm values against the manufacturer datasheet. This goes beyond what annotations provide and gives the agent a clear picture of side effects and reliability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, and every sentence contributes new information: lookup scope, usage modes, format guidance, metering, and a caution. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (dual lookup modes, response format options, metered access), the description covers all essential guidance: input strategies, precedence, format preference, and data validity warning. The output schema exists, so return values need no explanation here.
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% with parameter descriptions, but the description enriches semantics by explaining precedence behavior (partNumber takes precedence) and the practical distinction between responseFormat values. This adds value beyond the raw schema definitions, though it doesn't dive deep into each parameter.
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 opens with 'Look up electronics component pin assignments, voltage range, package, and alternatives,' which uses a specific verb and resource, making the tool's purpose immediately clear. It also differentiates from sibling tools like factreason_api_breaking_changes or factreason_integration_brief by focusing on component-level data.
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?
It explicitly explains when to use partNumber vs query, states the precedence rule, and advises setting responseFormat to compact for exact lookups. However, it does not explicitly compare to alternative sibling tools or state when not to use this tool, so it falls 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.
factreason_create_topup_linkAInspect
Create a Stripe Checkout URL for adding prepaid credit to the calling Bearer API key. This creates an external checkout session but does not charge a card. You CANNOT COMPLETE THE PAYMENT YOURSELF, so return the URL to a human, and credit is applied only after they complete payment. Use after HTTP 402 or when balance is low; the tool itself is not metered.
| Name | Required | Description | Default |
|---|---|---|---|
| amountUsd | Yes | Credit amount in USD; common blocks are 10, 50, and 200 |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| created | No | |
| amountUsd | No | |
| balanceUrl | No | |
| checkoutUrl | No | |
| createKeyUrl | No | |
| instructions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by disclosing that this tool creates an external checkout session, does not charge a card, and that credit is applied only after human payment. It also notes the tool itself is not metered. These are valuable behavioral insights that annotations do not provide, and there is no contradiction with the given hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. The opening sentence clearly states the primary purpose, and the following sentences build on it with essential usage and behavioral details. No unnecessary words or repetition are present.
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 simple tool with one parameter and an output schema, the description covers all necessary context: what the tool does, when to use it, limitations, and how the results should be handled. The existence of an output schema covers return values, so no further description is required.
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?
The input schema already provides full coverage for the single parameter 'amountUsd', including a description, minimum, maximum, and common block values. The tool description adds little new information about the parameter beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Create a Stripe Checkout URL for adding prepaid credit to the calling Bearer API key.' It uses a specific verb ('Create'), names the resource ('Stripe Checkout URL'), and specifies the context ('adding prepaid credit'). This clearly distinguishes it from the sibling tools, which focus on API discovery, advisories, and schema changes.
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 provides explicit usage guidance: 'Use after HTTP 402 or when balance is low.' It also explains what not to do ('You CANNOT COMPLETE THE PAYMENT YOURSELF') and instructs the user to return the URL to a human. This gives clear when-to-use and when-not-to-use context, fulfilling the top criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factreason_deprecation_scanARead-onlyIdempotentInspect
Scan publisher specifications for deprecated endpoints or parameters, sunset dates, and replacement operations. Omit filters for the catalogue-wide view, pass service to limit one API, and add endpoints to check selected paths. Uses metered access when findings exist. Use factreason_api_breaking_changes for broader version-to-version changes.
| Name | Required | Description | Default |
|---|---|---|---|
| service | No | Optional service filter, e.g. "Stripe" or "Twilio" | |
| endpoints | No | Optional endpoint paths to check within the selected service |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| found | No | |
| message | No | |
| results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/idempotentHint annotations, it discloses a non-obvious behavioral trait: 'Uses metered access when findings exist.' This adds cost/rate context not present in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences front-load the core purpose, then parameter usage, then the alternative tool. Every sentence earns its place with no repetition or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and this is an optional-filter scan tool, the description fully covers scope, filtering behavior, cost implications, and an alternative. No critical gaps remain.
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?
Although schema coverage is 100%, the description adds meaningful semantics: omitting filters yields catalogue-wide view, passing service limits to one API, and adding endpoints checks selected paths. This goes beyond the schema's simple optional descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('Scan publisher specifications for deprecated endpoints or parameters, sunset dates, and replacement operations') and explicitly distinguishes from a sibling tool ('Use factreason_api_breaking_changes for broader version-to-version changes').
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?
It provides clear parameter usage guidance ('Omit filters for the catalogue-wide view, pass service to limit one API, and add endpoints to check selected paths') and names an explicit alternative tool for related but different needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factreason_discover_apiARead-onlyIdempotentInspect
Find third-party APIs for a capability when the provider is unknown. Supply a concise capability such as "sms" or "manage DNS"; returns ranked services, example endpoints, and a next step. Uses metered access. When the provider is already known, call factreason_integration_brief instead.
| Name | Required | Description | Default |
|---|---|---|---|
| capability | Yes | Capability to search for, e.g. "send an SMS" or "charge a card" |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| count | No | |
| found | No | |
| billed | No | |
| message | No | |
| results | No | |
| nextStep | No | |
| capability | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description adds useful context beyond these: metered access (a cost/billing signal) and that it returns ranked services, example endpoints, and a next step. It clearly communicates the operation's outcome and cost implications, adding non-obvious behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero filler. It front-loads the core verb and resource, followed by concrete examples and an explicit sibling redirect. Every clause earns its place, making it efficient for an AI agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (1 param), full schema coverage, and rich output schema, the description covers all necessary context: what it does, when to use it, when not to, what it returns, and a caveat (metered access). No additional information is needed for correct invocation.
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% and has a single parameter with a clear example description. The description adds extra value by giving more examples ('sms', 'manage DNS') and emphasizing the need for conciseness. This goes slightly beyond the schema's example, enhancing semantic understanding without excessive duplication.
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?
Description clearly states the tool's purpose: finding third-party APIs for a capability when the provider is unknown. It uses a specific verb ('Find'), specifies the resource ('third-party APIs'), and includes scope ('when the provider is unknown'). Also explicitly distinguishes from a sibling ('call factreason_integration_brief instead').
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?
Provides explicit use-case context ('when provider is unknown') and gives a direct alternative ('when the provider is already known, call factreason_integration_brief instead'). Also supplies input format examples ('sms', 'manage DNS') and a next-step hint ('returns ... a next step'). This is model guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factreason_integration_briefARead-onlyIdempotentInspect
Compile one callable third-party API brief: base URL, auth scheme, required parameters and types, request body, and documented response codes. Service is required and endpoint optionally narrows the operation. Set responseFormat="compact" for tokenizer-measured context savings; the backward-compatible default returns the full brief plus compact form. Uses metered access. Prefer factreason_api_schema when exploring multiple endpoints.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Third-party API service, e.g. "Stripe" or "Twilio" | |
| endpoint | No | Optional path or operation fragment used to select one call | |
| responseFormat | No | Use compact for the callable facts only; full preserves the legacy brief response | full |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| brief | No | |
| found | No | |
| billed | No | |
| compact | No | |
| message | No | |
| service | No | |
| tokenMetrics | No | |
| nearestServices | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is set. The description adds valuable behavior: 'Uses metered access' and explains the full vs. compact response format (backward-compatible default and tokenizer savings), going beyond the annotations. Does not contradict annotations.
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 crisp sentences: purpose and content, key parameter behavior, usage alternative. No filler. Every clause carries distinct information, making it an exemplar of concise structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values are covered. The description supplies the essential context: what the brief contains, parameter roles, response format choices, metering, and when to use an alternative. It is complete for this tool's moderate complexity.
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% and each parameter already has a clear description. The description adds extra semantic nuance by explaining that responseFormat='compact' yields 'tokenizer-measured context savings' and notes that service is required while endpoint narrows the operation, enhancing the schema's guidance.
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 begins with 'Compile one callable third-party API brief' – a specific verb and resource. It enumerates the contents (base URL, auth scheme, required params, request body, response codes), which clearly distinguishes it from the sibling 'factreason_api_schema' that explores multiple endpoints.
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 states 'Prefer factreason_api_schema when exploring multiple endpoints', providing a clear when-not scenario and an alternative. Also notes the required service and optional endpoint, and mentions metered access, giving the agent actionable context for when 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.
factreason_package_upgrade_advisoryARead-onlyIdempotentInspect
Compare two exact published npm or PyPI versions and return publisher-declared registry metadata changes, including yanks, exports, module format, runtime floors, peers, and licences, with before/after evidence. Set responseFormat="compact" for tokenizer-measured context savings; the backward-compatible default is "full". This is a read-only metered lookup; misses are never billed and API keys receive a daily free allowance. Use it for package metadata; use factreason_api_breaking_changes for a third-party HTTP API, and consult changelogs for behavioural changes.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Exact target version, e.g. "5.0.0" | |
| from | Yes | Exact currently installed version, e.g. "4.1.2" | |
| name | Yes | Exact package name, e.g. "chalk" or "urllib3" | |
| registry | Yes | Registry containing both package versions | |
| responseFormat | No | Use compact to remove repeated prose and fields while retaining evidence; full preserves the legacy response contract | full |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | No | |
| scope | No | |
| billed | No | |
| message | No | |
| toVersion | No | |
| advisories | No | |
| fromVersion | No | |
| packageName | No | |
| tokenMetrics | No | |
| advisoryCount | No | |
| breakingCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the description does not need to restate safety. It adds valuable context beyond the annotations: "This is a read-only metered lookup; misses are never billed and API keys receive a daily free allowance." This informs the agent of billing implications and quota behavior, which is critical for cost-aware invocation. The description also notes responseFormat's backward compatibility, adding further behavioral nuance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, with the primary purpose stated in the first sentence and supporting guidance in two following short clauses. Every sentence earns its place: purpose, usage alternatives, metering note, and responseFormat hint. It is front-loaded and avoids repetitive or generic filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (5 params, output schema present) and rich annotations, the description covers all necessary contextual aspects: what the tool does, when to use it versus siblings, billing/rate-limit behavior, and a parameter-specific recommendation. The output schema handles return structure details, so the description does not need to enumerate them. The only minor omission is explicit error handling, but the "misses are never billed" line already hints at failure behavior, making this sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful extra context for responseFormat: "Set responseFormat="compact" for tokenizer-measured context savings; the backward-compatible default is "full"." This goes beyond the schema's basic enum description, explaining the why and the trade-off. It also implicitly ties registry,name,from,to to the purpose statement, reinforcing their role. No significant param semantics are left unexplained.
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 opens with a specific verb and resource: "Compare two exact published npm or PyPI versions and return publisher-declared registry metadata changes," and enumerates concrete fields (yanks, exports, module format, runtime floors, peers, licences). It also distinguishes from sibling tools by explicitly directing users to factreason_api_breaking_changes for third-party HTTP APIs and changelogs for behavioural changes, making the tool's unique scope unambiguous.
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 provides explicit usage context: "Use it for package metadata; use factreason_api_breaking_changes for a third-party HTTP API, and consult changelogs for behavioural changes." It also clarifies the optional responseFormat switch, including the backward-compatible default, which helps agents decide when to pass that parameter. This goes beyond basic context by naming alternatives and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
factreason_subscribe_spec_changesAIdempotentInspect
Create a persistent specification watch for one service; a Bearer API key is required and each key may hold up to 50 watches. Without webhookUrl, read future events from the polling endpoint; with a public HTTP(S) URL, FactReason sends signed POST callbacks after later spec changes. Duplicate or unsafe webhook registrations are rejected. This does not ingest a specification immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| webhookUrl | No | Optional public HTTP(S) URL for signed change callbacks; omit to poll | |
| serviceName | Yes | Service name to watch, e.g. "Stripe" or "SendGrid" |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| watch | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=true), the description exposes critical behavior: authentication requirements, per-key limit, webhook signing, rejection of duplicates/unsafe registrations, and the fact that no immediate ingestion occurs. This is substantial added context that helps an agent understand side effects and prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences but packs dense, relevant information: purpose, auth/limits, mode selection, callback signing, rejection rules, and a non-goal. Every sentence earns its place, with no redundant or verbose content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (two modes, auth, limits), the description covers all essential behavioral aspects: how to register, what happens with/without webhookUrl, and what it does not do. An output schema is present, so not describing return values is acceptable. The description is complete 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full descriptions for both parameters (serviceName and webhookUrl), with 100% coverage. The description adds some contextual detail (e.g., webhook ignores cause polling) but does not materially enhance the parameter understanding beyond the schema.
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 opens with 'Create a persistent specification watch for one service,' which is a specific verb+resource plus clear scope. It distinguishes this tool from siblings like factreason_api_breaking_changes or factreason_api_schema by focusing on subscription/watch functionality.
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 explains two distinct usage modes: omitting webhookUrl to poll, or providing a public URL for signed callbacks. It also gives a key constraint ('Bearer API key required, up to 50 watches') and a non-goal ('does not ingest a specification immediately'), which clarifies when to use the tool, though it does not explicitly name alternative sibling tools.
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
v2.0.4- Changed
factreason_component_spec6 fields changed- added
Input schema / properties / responseFormatAdded value: +{ + "default": "full", + "description": "Use compact for an exact part lookup; full preserves the legacy data response", + "enum": [ + "full", + "compact" + ], + "type": "string" +} - removed
Output schema / properties / compact / additionalPropertiesRemoved value: -true - changed
Output schema / properties / compact / typePrevious value: -"object"New value: +"string" - added
Output schema / properties / provenanceAdded value: +{ + "additionalProperties": true, + "type": "object" +} - added
Output schema / properties / qualityScoreAdded value: +{ + "type": "number" +} - added
Output schema / properties / tokenMetricsAdded value: +{ + "additionalProperties": false, + "properties": { + "compactTokens": { + "type": "number" + }, + "encoding": { + "const": "o200k_base", + "type": "string" + }, + "fullTokens": { + "type": "number" + }, + "reductionPct": { + "type": "number" + }, + "savedTokens": { + "type": "number" + } + }, + "type": "object" +}
- Changed
factreason_integration_brief4 fields changed- added
Input schema / properties / responseFormatAdded value: +{ + "default": "full", + "description": "Use compact for the callable facts only; full preserves the legacy brief response", + "enum": [ + "full", + "compact" + ], + "type": "string" +} - removed
Output schema / properties / compact / additionalPropertiesRemoved value: -true - changed
Output schema / properties / compact / typePrevious value: -"object"New value: +"string" - added
Output schema / properties / tokenMetricsAdded value: +{ + "additionalProperties": false, + "properties": { + "compactTokens": { + "type": "number" + }, + "encoding": { + "const": "o200k_base", + "type": "string" + }, + "fullTokens": { + "type": "number" + }, + "reductionPct": { + "type": "number" + }, + "savedTokens": { + "type": "number" + } + }, + "type": "object" +}
- Changed
factreason_package_upgrade_advisory3 fields changed- added
Input schema / properties / responseFormatAdded value: +{ + "default": "full", + "description": "Use compact to remove repeated prose and fields while retaining evidence; full preserves the legacy response contract", + "enum": [ + "full", + "compact" + ], + "type": "string" +} - added
Output schema / properties / advisoryCountAdded value: +{ + "type": "number" +} - added
Output schema / properties / tokenMetricsAdded value: +{ + "additionalProperties": false, + "properties": { + "compactTokens": { + "type": "number" + }, + "encoding": { + "const": "o200k_base", + "type": "string" + }, + "fullTokens": { + "type": "number" + }, + "reductionPct": { + "type": "number" + }, + "savedTokens": { + "type": "number" + } + }, + "type": "object" +}
10 tool updates
v2.0.2- Changed
factreason_api_breaking_changes8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / fromVersion / descriptionPrevious value: -"Optional: version currently targeted"New value: +"Optional exact version currently targeted" - added
Input schema / properties / fromVersion / minLengthAdded value: +1 - changed
Input schema / properties / service / descriptionPrevious value: -"Service name, e.g. \"Stripe\", \"OpenAI\", \"Supabase\""New value: +"Third-party API service, e.g. \"Stripe\" or \"OpenAI\"" - added
Input schema / properties / service / minLengthAdded value: +1 - changed
Input schema / properties / toVersion / descriptionPrevious value: -"Optional: version being upgraded to"New value: +"Optional exact version being evaluated" - added
Input schema / properties / toVersion / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "alternatives": { + "items": { + "type": "string" + }, + "type": "array" + }, + "billed": { + "type": "boolean" + }, + "changeCount": { + "type": "number" + }, + "changes": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "found": { + "type": "boolean" + }, + "meaning": { + "type": "string" + }, + "message": { + "type": "string" + }, + "service": { + "type": "string" + }, + "suggestion": { + "type": "string" + } + }, + "type": "object" +}
- Changed
factreason_api_schema6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / query / descriptionPrevious value: -"Endpoint path or operation, e.g. \"payment_intents\", \"chat/completions\""New value: +"Optional endpoint path or operation, e.g. \"payment_intents\"" - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Input schema / properties / service / descriptionPrevious value: -"Service name, e.g. \"Stripe\""New value: +"Optional service filter, e.g. \"Stripe\"" - added
Input schema / properties / service / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "found": { + "type": "boolean" + }, + "hint": { + "type": "string" + }, + "message": { + "type": "string" + }, + "nearestServices": { + "items": { + "type": "string" + }, + "type": "array" + }, + "results": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "totalMatched": { + "type": "number" + } + }, + "type": "object" +}
- Changed
factreason_auth_playbook4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / service / descriptionPrevious value: -"Service name, e.g. \"Stripe\", \"Twilio\", \"Cloudflare\""New value: +"Third-party API service, e.g. \"Stripe\", \"Twilio\", or \"Cloudflare\"" - added
Input schema / properties / service / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "compact": { + "additionalProperties": true, + "type": "object" + }, + "found": { + "type": "boolean" + }, + "message": { + "type": "string" + }, + "nearestServices": { + "items": { + "type": "string" + }, + "type": "array" + }, + "playbook": { + "additionalProperties": true, + "type": "object" + } + }, + "type": "object" +}
- Changed
factreason_component_spec7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / anyOfAdded value: +[ + { + "required": [ + "partNumber" + ] + }, + { + "required": [ + "query" + ] + } +] - changed
Input schema / properties / partNumber / descriptionPrevious value: -"Exact part number, e.g. \"STM32F401RE\", \"ESP32-WROOM-32E\""New value: +"Exact part number, e.g. \"STM32F401RE\"" - added
Input schema / properties / partNumber / minLengthAdded value: +1 - changed
Input schema / properties / query / descriptionPrevious value: -"Alternative: free-text search, e.g. \"3.3V ARM MCU with SPI\""New value: +"Free-text capability search, e.g. \"3.3V ARM MCU with SPI\"" - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "compact": { + "additionalProperties": true, + "type": "object" + }, + "data": { + "additionalProperties": true, + "type": "object" + }, + "found": { + "type": "boolean" + }, + "hint": { + "type": "string" + }, + "message": { + "type": "string" + }, + "nearestMatches": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "partNumber": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "totalMatched": { + "type": "number" + } + }, + "type": "object" +}
- Changed
factreason_create_topup_link5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / amountUsd / descriptionPrevious value: -"Amount of credit to purchase in USD (1 to 1000)."New value: +"Credit amount in USD; common blocks are 10, 50, and 200" - added
Input schema / properties / amountUsd / maximumAdded value: +1000 - added
Input schema / properties / amountUsd / minimumAdded value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "amountUsd": { + "type": "number" + }, + "balanceUrl": { + "format": "uri", + "type": "string" + }, + "checkoutUrl": { + "format": "uri", + "type": "string" + }, + "createKeyUrl": { + "format": "uri", + "type": "string" + }, + "created": { + "type": "boolean" + }, + "error": { + "type": "string" + }, + "instructions": { + "type": "string" + } + }, + "type": "object" +}
- Changed
factreason_deprecation_scan7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / endpoints / descriptionPrevious value: -"Optional list of endpoint paths to check"New value: +"Optional endpoint paths to check within the selected service" - added
Input schema / properties / endpoints / items / minLengthAdded value: +1 - added
Input schema / properties / endpoints / minItemsAdded value: +1 - changed
Input schema / properties / service / descriptionPrevious value: -"Optional: filter by service name, e.g. \"Stripe\", \"Twilio\""New value: +"Optional service filter, e.g. \"Stripe\" or \"Twilio\"" - added
Input schema / properties / service / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "found": { + "type": "boolean" + }, + "message": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
factreason_discover_api4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / capability / descriptionPrevious value: -"What you need to do, e.g. \"send an SMS\", \"charge a card\""New value: +"Capability to search for, e.g. \"send an SMS\" or \"charge a card\"" - added
Input schema / properties / capability / minLengthAdded value: +2 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "billed": { + "type": "boolean" + }, + "capability": { + "type": "string" + }, + "count": { + "type": "number" + }, + "found": { + "type": "boolean" + }, + "hint": { + "type": "string" + }, + "message": { + "type": "string" + }, + "nextStep": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
factreason_integration_brief6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / endpoint / descriptionPrevious value: -"Optional: narrow to endpoints matching this path or operation"New value: +"Optional path or operation fragment used to select one call" - added
Input schema / properties / endpoint / minLengthAdded value: +1 - changed
Input schema / properties / service / descriptionPrevious value: -"Service name, e.g. \"Stripe\", \"Twilio\", \"Cloudflare\""New value: +"Third-party API service, e.g. \"Stripe\" or \"Twilio\"" - added
Input schema / properties / service / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "billed": { + "type": "boolean" + }, + "brief": { + "additionalProperties": true, + "type": "object" + }, + "compact": { + "additionalProperties": true, + "type": "object" + }, + "found": { + "type": "boolean" + }, + "hint": { + "type": "string" + }, + "message": { + "type": "string" + }, + "nearestServices": { + "items": { + "type": "string" + }, + "type": "array" + }, + "service": { + "type": "string" + } + }, + "type": "object" +}
- Changed
factreason_package_upgrade_advisory9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / from / descriptionPrevious value: -"Version currently installed, e.g. \"4.1.2\""New value: +"Exact currently installed version, e.g. \"4.1.2\"" - added
Input schema / properties / from / minLengthAdded value: +1 - changed
Input schema / properties / name / descriptionPrevious value: -"Package name, e.g. \"chalk\", \"urllib3\""New value: +"Exact package name, e.g. \"chalk\" or \"urllib3\"" - added
Input schema / properties / name / minLengthAdded value: +1 - changed
Input schema / properties / registry / descriptionPrevious value: -"Which registry the package is published on"New value: +"Registry containing both package versions" - changed
Input schema / properties / to / descriptionPrevious value: -"Version you intend to upgrade to, e.g. \"5.0.0\""New value: +"Exact target version, e.g. \"5.0.0\"" - added
Input schema / properties / to / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "advisories": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "billed": { + "type": "boolean" + }, + "breakingCount": { + "type": "number" + }, + "found": { + "type": "boolean" + }, + "fromVersion": { + "type": "string" + }, + "message": { + "type": "string" + }, + "packageName": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "toVersion": { + "type": "string" + } + }, + "type": "object" +}
- Changed
factreason_subscribe_spec_changes7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / serviceName / descriptionPrevious value: -"Service name to watch, e.g. \"Stripe\", \"SendGrid\""New value: +"Service name to watch, e.g. \"Stripe\" or \"SendGrid\"" - added
Input schema / properties / serviceName / maxLengthAdded value: +200 - added
Input schema / properties / serviceName / minLengthAdded value: +1 - changed
Input schema / properties / webhookUrl / descriptionPrevious value: -"Optional HTTP POST webhook URL to receive notifications"New value: +"Optional public HTTP(S) URL for signed change callbacks; omit to poll" - added
Input schema / properties / webhookUrl / formatAdded value: +"uri" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "error": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "watch": { + "additionalProperties": true, + "properties": { + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "serviceName": { + "type": "string" + }, + "webhookUrl": { + "format": "uri", + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" +}
10 tool updates
v2.0.1- First observed
factreason_api_breaking_changes - First observed
factreason_api_schema - First observed
factreason_auth_playbook - First observed
factreason_component_spec - First observed
factreason_create_topup_link - First observed
factreason_deprecation_scan - First observed
factreason_discover_api - First observed
factreason_integration_brief - First observed
factreason_package_upgrade_advisory - First observed
factreason_subscribe_spec_changes
TDQS
Scored across 10 tools
Each tool targets a distinct resource and action, with explicit cross-references to prevent confusion (e.g., api_schema vs integration_brief vs auth_playbook). The overlapping-looking deprecation_scan and api_breaking_changes are clearly differentiated as scan vs version comparison. Descriptions are precise and include guidance on when to use alternatives.
All tools share the factreason_ prefix and snake_case format, maintaining a predictable style. However, some names are noun phrases (package_upgrade_advisory) while others are verb phrases (discover_api), creating a minor inconsistency in verb_noun structure. Despite this, the pattern is uniform and readable.
With 10 tools, the set is well-scoped for the service's breadth, covering packages, APIs, components, and billing without unnecessary bloat. Each tool represents a distinct capability, and none feel redundant or superfluous. The count falls comfortably within the ideal range.
The tool surface covers a wide range of operations for packages, APIs, and components, including discovery, schema lookup, breaking changes, deprecations, auth, and subscription. Minor omissions exist, such as lack of a simple package metadata lookup or a way to fetch current versions, but core workflows are well-supported. The temporary unavailability of api_breaking_changes is a service state, not a design gap.
Maintenance
Related MCP Connectors
Dev-registry data: npm/PyPI/Docker/VS Code packages, dep graphs, vulns, 50+ ecosystems.
Security research: MCP registries verify identity, not tool behavior. See gtfo.dev.
Remote MCP for A2A dependency inspector MCP, structured receipts, audit logs, and reviewer-ready evi
deps.dev — Google's package metadata + dependency graph API
Related MCP Servers
- AlicenseAqualityAmaintenanceA Model Context Protocol server that fetches up-to-date, version-specific documentation and code examples from libraries directly into LLM prompts, helping developers get accurate answers without outdated or hallucinated information.2807,53861,901MIT
- AlicenseAqualityBmaintenanceEnables querying package ecosystem data from ecosyste.ms, including package metadata, versions, security advisories, dependencies, and repository information across 40+ package registries with fast local SQLite lookups and API fallback.10319MIT
- AlicenseAqualityCmaintenanceAn MCP server that queries 19 package registries (npm, PyPI, crates.io, etc.) to retrieve the latest version of packages and their metadata.211MIT
- AlicenseAqualityAmaintenanceEnables AI coding agents to retrieve the latest stable versions of packages and tools across multiple ecosystems, preventing outdated dependency versions in generated code.48Apache 2.0