franchisedata-mcp
Access franchise restaurant data—locations, operations, economics, and competitive intelligence—through 17 MCP tools.
Search indexed franchise brands and endpoint documentation (FREE).
Check credit balance, top up prepaid credits, or mint new API keys.
Fetch McDonald's locations and Starbucks live store status.
Run radial cross-brand searches for nearby open restaurants.
Detect POS/tech stack, online ordering, and KDS fingerprints.
Retrieve multi-unit franchisee ownership and operator intelligence.
Get FDD Item 19 AUV, royalty fees, and investment ranges.
Analyze local menu pricing, price variance, and digital shelf share.
Track brand openings, closures, and relocations.
Generate weekly operating scorecards and local action recommendations.
Perform semantic vector search across operators and menu items.
Call any REST endpoint via universal fetch fallback (PAID).
Supports hyperlocal digital shelf observations for DoorDash as part of local share-of-choice analysis.
Provides fast lookup of McDonald's store locations, including drive-thru filters.
Provides real-time operating hours and open/closed status for Starbucks stores.
Supports hyperlocal digital shelf observations for Uber Eats as part of local share-of-choice analysis.
franchisedata-mcp
Official Model Context Protocol (MCP) server for franchisedata.io — the commercial intelligence gateway for restaurant franchise location data, in-store POS hardware fingerprints, statutory FDD Item 19 unit economics, and multi-unit franchisee ownership trees.
Powered by the official @modelcontextprotocol/sdk (TypeScript + Zod) with built-in token compaction, dynamic tool scoping, and exponential backoff resilience.
Compatible with Claude Desktop, Cursor, Zed, Cline, and autonomous AI agent runtimes.
🚀 Quick Install
1. Claude Desktop (via Smithery)
npx -y @smithery/cli install franchisedata-mcp --client claude2. Claude Desktop (claude_desktop_config.json)
Remote Streamable HTTP (Zero Local Dependencies)
{
"mcpServers": {
"franchisedata": {
"url": "https://franchisedata.io/mcp",
"headers": {
"Authorization": "Bearer fc_live_optional_pro_key"
}
}
}
}Local CLI Runner (via npx)
{
"mcpServers": {
"franchisedata": {
"command": "npx",
"args": ["-y", "franchisedata-mcp"],
"env": {
"FRANCHISE_API_KEY": "fc_live_optional_pro_key",
"FRANCHISE_MODE": "all"
}
}
}
}3. Cursor
In Cursor Settings -> Features -> MCP Servers -> Add New MCP Server:
Name:
franchisedataType:
commandCommand:
npx -y @outis-co/franchisedata-mcp
Related MCP server: guerrilla-franchising-mcp-server
⚡ Agent Experience (AX) & Token Optimization
Dynamic Tool Scoping (FRANCHISE_MODE)
Prevent LLM context window bloat by loading only the tools relevant to your agent's current objective:
Mode | Tools Loaded | Best For |
| 6 tools | Brand discovery, catalog lookups, and endpoint exploration. Minimal token footprint (~1,200 tokens). |
| 10 tools | Underwriting, commercial due diligence, FDD Item 19 analysis, and operator portfolios. |
| 13 tools | Store-level operations, POS hardware fingerprints, aggregator visibility, and live status. |
| 17 tools | Full comprehensive franchise commercial intelligence suite. |
Automatic Response Compaction
By default (FRANCHISE_COMPACT=true), responses recursively prune null attributes, empty arrays, and extraneous internal SQLite keys, saving 40% to 60% of agent context tokens while preserving 100% of financial figures, unit counts, coordinates, and operational facts.
Network Resilience
Built-in exponential backoff retry (1s, 2s, 4s with random jitter) on HTTP 429 rate limits or 5xx server errors, backed by a 30-second abort timeout.
🛠️ Registered MCP Tools (17 Grade A Tools)
Every tool provides strict Zod input validation, typed outputSchema, MCP behavioral annotations (readOnlyHint, idempotentHint), and explicit disambiguation boundaries (WHEN TO USE / WHEN NOT TO USE / ALTERNATIVES).
Tool Name | Type | Category | Description |
| FREE | Catalog | Search all 500 indexed chains by concept, sector, or category. |
| FREE | Catalog | Inspect schema, parameters, and pricing for any REST API endpoint. |
| FREE | Catalog | Read-only check of remaining credit balance in USD. |
| State-Mutating | Catalog | Mint a new API key ($1.00 min) or top up prepaid credits. |
| Universal | Catalog | Parameterized runner calling any REST endpoint when dedicated tool is not present. |
| PAID ($0.005) | Catalog | pgvector cosine similarity search across multi-unit operators and menu items. |
| PAID ($0.010) | Financials | Statutory Item 19 AUV quartiles, royalty fee %, and EBITDA benchmarks. |
| PAID ($0.005) | Financials | Multi-unit franchisee holding LLCs, PE backing, and store fleet counts. |
| PAID ($0.003) | Financials | Real-time audit log of store openings, permanent closures, and fleet relocations. |
| PAID ($0.003) | Financials | Localized menu item pricing, national benchmarks, and price variance analysis. |
| PAID ($0.003) | Locations | Fast lookup of McDonald's stores with drive-thru, 24h, and PlayPlace filters. |
| PAID ($0.002) | Locations | Real-time operating hours, active open/closed status, and store features. |
| PAID ($0.005) | Locations | Radial cross-brand coordinate search (up to 50 miles) for open restaurant locations. |
| PAID ($0.003) | Intelligence | Fingerprint POS (Toast, Aloha, Brink), KDS, and online ordering gateways. |
| PAID ($0.005) | Intelligence | Hyperlocal digital shelf observations across DoorDash, Uber Eats, and 1P web. |
| PAID ($0.010) | Intelligence | Standardized 6-Question Weekly Operating Review Scorecard for store diagnostics. |
| PAID ($0.005) | Intelligence | Margin-guardrailed tactical interventions with holdout test design. |
⚙️ Environment Variables
Variable | Default | Description |
|
| Optional |
|
| Upstream JSON-RPC endpoint. |
|
| Scoping mode: |
|
| Toggles automatic null-pruning and token reduction. |
|
| HTTP request timeout in milliseconds. |
|
| Maximum exponential backoff retry attempts. |
📄 License
MIT © Outis Co
Available Tools
17 toolscheck_balanceCheck API Credit BalanceARead-onlyIdempotent
FREE. Query the remaining prepaid credit balance (in USD and micro-USD) and active status for a FranchiseData Pro API key. Read-only operation requiring an API key passed via 'api_key' argument or 'Authorization: Bearer fc_live_...' header. Returns 400 if key is omitted, or 401 if key is invalid. WHEN TO USE: Use before executing batch paid queries to verify sufficient funds remain. WHEN NOT TO USE: Do not use for minting new keys or topping up funds; use 'topup_credits' instead. ALTERNATIVES: Use 'topup_credits' to deposit credits or create new credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional if Authorization HTTP header is set. The 'fc_live_...' API key to inspect. |
Output Schema
| Name | Required | Description |
|---|---|---|
| is_active | Yes | Whether the API key is active |
| key_prefix | No | Public key prefix (e.g. 'fc_live_7321...') |
| balance_usd | Yes | Formatted USD balance (e.g. '$4.50') |
| balance_micro | Yes | Balance in micro-USD (1 USD = 1,000,000 micro) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnlyHint and idempotentHint, and the description adds value beyond them: it is free, it documents the auth mechanism (api_key arg or Authorization: Bearer fc_live_... header), and it discloses specific failure modes (400 on missing key, 401 on invalid key). That is meaningful behavior an agent cannot get from the annotation block.
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?
Front-loads the most decision-relevant fact ('FREE') and organizes the rest into labeled sections, so it scans quickly. Slightly verbose with all-caps section headers and some repetition between the auth sentence and the parameter description, but nothing is wasted.
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?
An output schema exists, so return values need no prose. Combined with clear usage conditions, auth requirements, and error codes, the description gives an agent everything needed to invoke this single-parameter read 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?
Schema coverage is 100% and the schema already states the key is optional if the Authorization header is set, so the description largely restates parameter behavior. It mildly reinforces the header fallback but adds no format or validation detail beyond the schema. Baseline 3 for full coverage.
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+resource ('Query the remaining prepaid credit balance... for a FranchiseData Pro API key') and names what it is not for. The sibling topup_credits is explicitly contrasted, so an agent can route without opening either 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?
Explicit WHEN TO USE ('before executing batch paid queries to verify sufficient funds'), WHEN NOT TO USE ('do not use for minting new keys or topping up funds'), and a named alternative ('use topup_credits'). All three guidance elements are present with the selecting condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_endpointDescribe Endpoint Schema and PricingARead-onlyIdempotent
FREE. Inspect technical documentation, supported query parameters, authentication methods, and per-call pricing for any REST API route on franchisedata.io. Read-only operation requiring no API key or balance. Rate limit: 60 req/min. Returns 404 if the endpoint route is unrecognized. WHEN TO USE: Use before calling 'fetch_franchise_data' to verify required query parameters, authentication headers, and per-request prices. WHEN NOT TO USE: Do not use to fetch actual brand data records; use 'fetch_franchise_data' or specialized shortcut tools instead. ALTERNATIVES: Use 'search_brands' to discover brand slugs; use 'fetch_franchise_data' to execute the request.
| Name | Required | Description | Default |
|---|---|---|---|
| endpoint | Yes | Target REST API path to inspect (e.g. '/api/brands/mcdonalds/locations', '/api/brands/tacobell/operators'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| formats | No | Supported response formats |
| pricing | Yes | Per-request pricing description |
| endpoint | Yes | Requested endpoint path |
| authentication | No | Accepted authentication headers |
| supported_methods | Yes | Supported HTTP methods |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnly/idempotent/closed-world; the description adds the traits that actually matter for calling it: free of charge, no API key or balance required, a 60 req/min rate limit, and explicit 404 behavior for unrecognized routes. This is well beyond what the structured fields provide.
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?
Front-loads the most decision-relevant fact ('FREE') and then chunks behavior and routing into labeled sections. Dense with no filler sentences; each clause carries a distinct operational fact.
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?
An output schema exists, so return-value description is unnecessary. With the cost, auth, rate-limit, and error behavior all stated, an agent has everything needed to invoke this 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?
Schema coverage is 100% and the single 'endpoint' parameter is already documented with examples in the schema. The description restates the target as 'any REST API route' but adds no format or syntax detail beyond the schema, so the baseline 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?
States a specific verb (Inspect/Describe) and resource (REST API route schema, auth, pricing) and explicitly scopes it to franchisedata.io endpoints. It clearly distinguishes itself from 'fetch_franchise_data' and the shortcut tools, so an agent can route between them without opening either 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?
Contains explicit WHEN TO USE, WHEN NOT TO USE, and ALTERNATIVES sections naming the sibling tools and the conditions that select them. Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_tech_stackDetect In-Store POS and Kitchen Tech StackARead-onlyIdempotent
PAID ($0.003). Fingerprint point-of-sale (POS) hardware (Toast, NCR Aloha, Brink, Micros, Square), kitchen display systems (KDS), and online ordering gateways for a store location. Atomically debits $0.003. Requires 'fc_live_...' API key. Returns 402 if balance insufficient. WHEN TO USE: Use for restaurant tech competitive auditing, vendor market share tracking, and POS displacement prospecting. WHEN NOT TO USE: Do not use for menu item prices (use 'get_menu_pricing') or store status (use 'starbucks_store_status'). ALTERNATIVES: Use 'get_menu_pricing' for item prices; use 'get_operator_intelligence' for franchisee ownership.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Canonical brand slug (e.g. 'chickfila', 'sweetgreen', 'subway', 'mcdonalds') | |
| store_id | Yes | Unique store number or store ID (e.g. 'loc_subway_1001') |
Output Schema
| Name | Required | Description |
|---|---|---|
| tech_stack | No | Fingerprinted technology components for the location |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/idempotent/closed-world; the description adds the non-obvious operational facts an agent needs: a $0.003 paid call, atomic debit semantics, the required 'fc_live_...' key prefix, and a 402 response when balance is insufficient. This is real value beyond the structured fields, and the billing behavior does not contradict the readOnly annotation.
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?
Front-loaded with cost and capability, then constraints, then routing — a sensible priority order with no filler sentences. The brand enumeration and ALL-CAPS section labels are dense but each clause carries distinct information.
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?
An output schema exists, so return-shape explanation is unnecessary; the description fills the remaining gaps that structured fields do not (price, billing atomicity, auth key, 402 failure mode, usage routing). An agent has everything needed to call this correctly or route elsewhere.
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% with examples for both brand and store_id, so the schema already carries the parameter burden. The description adds no format, canonicalization, or validation detail beyond what the schema states, so the baseline 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?
States a specific verb (fingerprint) plus the exact resources targeted (POS hardware brands, KDS, online ordering gateways) and scopes it to a single store location. It explicitly names the sibling tools it is not (get_menu_pricing, starbucks_store_status), so an agent can disambiguate without opening a 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?
Explicitly structured as WHEN TO USE (tech competitive auditing, vendor share tracking, POS displacement prospecting), WHEN NOT TO USE with the correct alternatives named, and an ALTERNATIVES line routing get_menu_pricing and get_operator_intelligence to their proper cases. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_franchise_dataUniversal Franchise REST Endpoint RunnerARead-onlyIdempotent
PAID ($0.002 - $0.005). Execute parameterized REST queries against any franchisedata.io API endpoint with typed arguments. Atomically debits balance per request. Requires 'fc_live_...' API key with sufficient balance. Returns 402 if balance is insufficient. WHEN TO USE: Use ONLY as an escape hatch for arbitrary or custom REST routes not covered by typed shortcut tools. WHEN NOT TO USE: Do not use when a dedicated typed tool exists (e.g. use 'get_fdd_item19' for FDD unit economics, 'detect_tech_stack' for POS hardware, 'get_operator_intelligence' for ownership trees, 'mcdonalds_locations' for McDonald's stores). ALTERNATIVES: Use 'describe_endpoint' first to verify route parameters; use specialized shortcuts for validated schemas.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | API endpoint route path (e.g. '/api/brands/mcdonalds/locations', '/api/brands/wendys/store/101/status'). | |
| params | No | Key-value map of URL query parameters (e.g. { 'state': 'CA', 'drive_thru': 'true', 'limit': 10 }). | |
| api_key | No | Optional if Authorization header is set. Your 'fc_live_...' API key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Array of returned record rows from the database |
| endpoint | Yes | Target REST endpoint path executed |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, and the description goes well beyond them: per-request pricing ($0.002-$0.005), atomic balance debiting, required 'fc_live_...' key with sufficient balance, and a 402 failure mode. That is exactly the operational context an agent needs before invoking a paid, credential-gated call.
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?
Front-loads the paid/cost signal and uses clear labeled sections (WHEN TO USE, WHEN NOT TO USE, ALTERNATIVES) that make it skimmable. It is dense and slightly long, but every sentence earns its place; no 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?
For a generic paid REST passthrough with an output schema present, the description covers everything the agent needs: cost, auth requirements, failure mode, and when to prefer typed alternatives. Return-value detail is correctly omitted since the output schema handles it.
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 examples in every parameter description ('/api/brands/mcdonalds/locations', {'state':'CA',...}), so the schema carries parameter semantics. The description adds only the general notion of 'typed arguments' and does not extend path/params/api_key meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Execute) and resource (parameterized REST queries against franchisedata.io endpoints), and explicitly frames itself as a generic escape hatch. The agent can distinguish it from typed shortcut siblings 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?
Has explicit WHEN TO USE / WHEN NOT TO USE / ALTERNATIVES sections, naming four concrete sibling tools (get_fdd_item19, detect_tech_stack, get_operator_intelligence, mcdonalds_locations) and the condition that selects each. It even routes the agent to describe_endpoint first to verify routes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
franchise_search_nearRadial Cross-Brand Location Proximity SearchARead-onlyIdempotent
PAID ($0.005). Radial coordinate-based proximity search (up to 50 miles) across all 500 US restaurant franchise chains. Returns geocoded locations, distance, and brand classification. Atomically debits $0.005 from prepaid balance. Requires 'fc_live_...' API key. Returns 402 if balance is insufficient. WHEN TO USE: Use for geographic competitive landscape queries, local market density analysis, and finding nearby restaurants across multiple brands. WHEN NOT TO USE: Do not use for single-brand McDonald's lookups by city/zip (use 'mcdonalds_locations') or brand catalog metadata (use 'search_brands'). ALTERNATIVES: Use 'mcdonalds_locations' for dedicated McDonald's filters; use 'get_local_share_of_choice' for delivery shelf share.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Center latitude coordinate in decimal degrees (e.g. 41.8781) | |
| lng | Yes | Center longitude coordinate in decimal degrees (e.g. -87.6298) | |
| category | No | Optional category filter (e.g. 'Burger', 'Coffee', 'Pizza', 'Chicken') | |
| radius_miles | No | Search radius in statute miles (default 10, max 50) |
Output Schema
| Name | Required | Description |
|---|---|---|
| center | Yes | |
| results | Yes | List of nearby restaurant store records across indexed brands |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/idempotentHint/openWorldHint annotations by disclosing cost ($0.005), that the debit is atomic, the required 'fc_live_...' API key, and the 402 failure mode on insufficient balance. The $0.005 metering debit is a billing side effect of a read-only data operation, so it is consistent with readOnlyHint rather than contradicting it.
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?
Front-loads cost and operation, then layers usage, exclusions, and alternatives in scannable labeled blocks. Every sentence carries routing or behavioral information with no 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?
An output schema exists, so return values need no prose. For a paid, authenticated search tool the description covers cost, auth, error behavior, scope limits, and sibling routing — everything an agent needs to call it 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?
Schema description coverage is 100% and the schema already documents all four parameters with examples and defaults (radius default 10, max 50). The description restates the 50-mile cap and category use case but adds no syntax or format detail beyond the schema, so the baseline 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?
States a specific verb and resource — a radial coordinate proximity search across 500 US restaurant franchise chains — plus scope (up to 50 miles) and return contents (geocoded locations, distance, brand classification). It is clearly distinguishable from siblings like mcdonalds_locations and search_brands.
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 WHEN TO USE (geographic competitive landscape, market density, multi-brand nearby search), WHEN NOT TO USE with named alternatives for each case (mcdonalds_locations for single-brand, search_brands for catalog metadata), and a dedicated ALTERNATIVES line including get_local_share_of_choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fdd_item19Statutory FDD Item 19 Unit EconomicsARead-onlyIdempotent
PAID ($0.010). Retrieve regulatory Franchise Disclosure Document (FDD) Item 19 financial disclosures: Average Unit Volume (AUV), quartile revenue tiers, royalty fee %, marketing fund %, and initial capital investment requirements. Atomically debits $0.010. Requires 'fc_live_...' API key. Returns 402 if balance insufficient. WHEN TO USE: Use for franchise investment underwriting, brand unit-level financial benchmarking, and royalty fee comparisons. WHEN NOT TO USE: Do not use for store-level weekly performance (use 'get_weekly_scorecard') or individual store pricing (use 'get_menu_pricing'). ALTERNATIVES: Use 'get_weekly_scorecard' for operational store scorecards; use 'search_brands' to discover brand catalog.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Canonical brand slug (e.g. 'chickfila', 'mcdonalds', 'wendys', 'culvers', 'popeyes') |
Output Schema
| Name | Required | Description |
|---|---|---|
| brand | Yes | Brand slug queried |
| fdd_item19 | No | FDD Item 19 regulatory financial disclosures |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/idempotent/openWorld, so the description carries real weight and delivers: it discloses the $0.010 charge, atomic debit behavior, the required 'fc_live_' API key, and the 402 response when balance is insufficient. These are operationally critical facts absent from the structured fields.
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?
Front-loaded with cost and purpose, then cleanly sectioned by use/not-use/alternatives. Minor redundancy: the $0.010 charge is stated twice ('PAID ($0.010)' and 'Atomically debits $0.010'), which costs a little tightness but not clarity.
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 an output schema present, return-value explanation is unnecessary, and the description already covers pricing, auth prerequisites, failure mode, and routing guidance. An agent has everything needed to invoke it correctly and budget for it.
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 the single 'brand' parameter is fully documented in the schema with examples, so the description adds no further semantic detail. Baseline 3 is appropriate when the schema does all the work.
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 (Retrieve) and resource (regulatory FDD Item 19 financial disclosures), then enumerates the exact contents (AUV, quartile revenue tiers, royalty %, marketing fund %, capital requirements). This is enough to distinguish it from any sibling without opening a 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?
Explicit WHEN TO USE, WHEN NOT TO USE, and ALTERNATIVES sections name the substitute siblings directly: get_weekly_scorecard for store ops, get_menu_pricing for store pricing, search_brands for discovery. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_operator_intelligenceMulti-Unit Franchisee Ownership IntelligenceARead-onlyIdempotent
PAID ($0.005). Retrieve corporate franchisee entity trees, operating LLCs, portfolio unit counts, and executive leadership contacts. Requires either 'operator_id' OR both 'brand' and 'store_id'. Atomically debits $0.005. Requires 'fc_live_...' API key. Returns 402 if balance insufficient. WHEN TO USE: Use to identify who owns and operates a franchise location (e.g. Flynn Group, Carrols), examine multi-unit consolidation, and find franchisee executive contacts. WHEN NOT TO USE: Do not use for corporate franchisor FDD financial benchmarks (use 'get_fdd_item19') or in-store hardware (use 'detect_tech_stack'). ALTERNATIVES: Use 'get_fdd_item19' for statutory Item 19 disclosures; use 'semantic_vector_search' to find operators by fuzzy concept.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | Canonical brand slug (e.g. 'tacobell', 'applebees', 'wendys'). Used when querying by store. | |
| store_id | No | Store ID (e.g. 'loc_tacobell_1001') to look up controlling franchisee. | |
| operator_id | No | Direct operator entity ID (e.g. 'op_flynn_group'). Provide this OR provide both 'brand' and 'store_id'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| operator | No | Full operator profile when queried by operator_id |
| operators | No | List of operator associations when queried by brand/store |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint/idempotentHint/openWorldHint), but the description adds substantial value: pricing ($0.005), the atomic debit, the required 'fc_live_...' API key, and the 402 insufficient-balance behavior. The only tension is the debit side effect against readOnlyHint, though this concerns billing rather than domain-data mutation, so it is supplemental rather than contradictory.
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?
Front-loads the cost and auth requirement, then sections usage guidance cleanly; nearly every sentence earns its place. Slight redundancy in naming get_fdd_item19 twice (WHEN NOT TO USE and ALTERNATIVES) keeps it just below top marks.
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 paid, key-gated read tool with an output schema, the description covers everything an agent needs: cost, auth, error behavior, selection rule, and routing to alternatives. Return-format details are correctly left to the output schema.
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% and the schema already documents brand, store_id, and operator_id as well as the OR relationship. The description restates the selection rule ('operator_id' OR both 'brand' and 'store_id'), which is helpful confirmation but adds little beyond the schema, so the baseline 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?
States a specific verb and resource ('Retrieve corporate franchisee entity trees, operating LLCs, portfolio unit counts, and executive leadership contacts') and names concrete examples (Flynn Group, Carrols). It is immediately distinguishable from sibling lookups like get_fdd_item19 or detect_tech_stack.
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?
Explicit WHEN TO USE, WHEN NOT TO USE, and ALTERNATIVES sections name the exact sibling tools to route to (get_fdd_item19 for Item 19, semantic_vector_search for fuzzy operator search, detect_tech_stack for hardware). No condition is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_weekly_scorecardWeekly Operating Review Store ScorecardARead-onlyIdempotent
PAID ($0.010). Retrieve the standardized 6-Question Weekly Operating Review Scorecard for a restaurant location covering Funnel conversion, Drivers, Competitor Moves, Fact vs Inference, 1 Recommended Action, and Holdout design. Atomically debits $0.010. Requires 'fc_live_...' API key. If 'week' is omitted, defaults to latest evaluated week. Returns 404 if no scorecard found, 402 if balance insufficient. WHEN TO USE: Use for weekly operational store diagnostics, executive unit reviews, and root-cause sales analysis. WHEN NOT TO USE: Do not use for general location searches (use 'franchise_search_near') or brand FDD data (use 'get_fdd_item19'). ALTERNATIVES: Use 'recommend_local_action' for isolated action extraction; use 'get_local_share_of_choice' for raw delivery panel telemetry.
| Name | Required | Description | Default |
|---|---|---|---|
| week | No | Optional week identifier in ISO format (e.g. '2026-W36'). If omitted, defaults to the most recent week. | |
| store_id | Yes | Target store ID or store number (e.g. 'loc_mcdonalds_1001') |
Output Schema
| Name | Required | Description |
|---|---|---|
| week | Yes | Evaluated week identifier |
| store_id | Yes | Store identifier |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
| question_1_what_changed | Yes | Funnel conversion and traffic deltas |
| question_3_competitor_moves | No | Local competitor pricing and promotional shifts |
| question_2_why_did_it_change | No | Driver diagnostics and decomposition |
| question_4_fact_vs_inference | No | Separation of observed facts vs testable inferences |
| question_5_recommended_action | Yes | Single controllable tactical intervention |
| question_6_holdout_evaluation | No | Empirical holdout evaluation from prior week |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), and the description goes well beyond them with the price ($0.010 atomic debit), the required 'fc_live_...' API key, the default-week fallback, and the specific failure modes (404 no scorecard, 402 insufficient balance). This is exactly the billing/auth/error context annotations cannot express.
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?
Front-loads the price, then purpose, constraints, and finally the routing sections, so the most decision-relevant facts come first. Slightly repetitive in stating the price twice ('PAID ($0.010)' and 'Atomically debits $0.010'), but overall every block earns its place.
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 an output schema present, return values need not be described; the description instead supplies cost, auth requirements, default behavior, error codes, and full sibling routing. Nothing an agent needs to invoke this paid tool correctly is missing.
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 both parameters already carry their own documentation. The description restates the week default ('latest evaluated week') but adds no syntax or format detail beyond what 'week' and 'store_id' already document, 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?
States a specific verb (Retrieve) and a precisely scoped resource (the standardized 6-Question Weekly Operating Review Scorecard for a restaurant location), even enumerating the six sections it contains. An agent can distinguish it from every sibling (e.g. get_fdd_item19, franchise_search_near) without opening a 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?
Explicit WHEN TO USE (weekly operational store diagnostics, executive unit reviews, root-cause sales analysis) and WHEN NOT TO USE clauses that name the correct alternatives ('franchise_search_near' for location search, 'get_fdd_item19' for brand FDD). An ALTERNATIVES line further routes 'recommend_local_action' and 'get_local_share_of_choice' to adjacent use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcdonalds_locationsQuery McDonald's Store LocationsARead-onlyIdempotent
PAID ($0.003). Dedicated fast search for McDonald's fleet stores filtered by city, state, postal zip code, and drive-thru availability. Atomically debits $0.003 from prepaid balance. Requires 'fc_live_...' API key. Returns 402 if balance is insufficient. WHEN TO USE: Use specifically when looking up McDonald's store locations and filtering for drive-thru lanes. WHEN NOT TO USE: Do not use for other chains or cross-brand searches; use 'franchise_search_near' instead. ALTERNATIVES: Use 'franchise_search_near' for coordinate-based cross-brand proximity search; use 'search_brands' to discover other chains.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | Five-digit US postal ZIP code (e.g. '60601') | |
| city | No | City name to filter stores by (e.g. 'Chicago', 'Dallas') | |
| limit | No | Maximum number of store records to return (default 25, max 50) | |
| state | No | Two-letter US state postal code (e.g. 'IL', 'TX', 'CA') | |
| drive_thru | No | Filter exclusively for stores with verified drive-thru lanes |
Output Schema
| Name | Required | Description |
|---|---|---|
| brand | Yes | Brand name ('McDonald\'s') |
| count | Yes | Number of matching locations found |
| locations | Yes | List of McDonald's store records matching filters |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly, idempotent, closed-world); the description adds material context the annotations cannot convey — the $0.003 atomic debit, the required 'fc_live_...' API key, and the 402 insufficient-balance behavior. This is exactly the kind of paid-endpoint disclosure that prevents failed calls.
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?
Front-loaded with cost and capability, then organized into UPPERCASE routing headers — efficient and scannable. The filter list is slightly redundant with the schema, keeping it just short of a 5.
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?
An output schema exists so return values need not be explained, and the description covers cost, auth, error handling, and routing. Nothing an agent needs to invoke this tool correctly is missing.
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 every parameter (zip, city, limit, state, drive_thru) is already documented with examples in the schema. The description only restates the filter dimensions at a high level, adding no new syntax or semantics. Baseline 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?
States a specific verb (search) and resource (McDonald's store locations) with the exact filter dimensions, and explicitly names the sibling it is not (franchise_search_near). An agent can distinguish it from cross-brand siblings 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?
Contains explicit WHEN TO USE, WHEN NOT TO USE, and ALTERNATIVES clauses, naming franchise_search_near and search_brands as the correct tools for adjacent use cases. Routing is fully determined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_local_actionRecommend Margin-Guardrailed Local ActionARead-onlyIdempotent
PAID ($0.005). Synthesize local competitor shifts and digital funnel gaps to formulate a single controllable, margin-guardrailed tactical intervention with matched holdout test design. Atomically debits $0.005. Requires 'fc_live_...' API key. Returns 404 if no scorecard exists, 402 if balance insufficient. WHEN TO USE: Use to formulate an immediate, actionable operational response to local competitive pressure with rigorous holdout controls. WHEN NOT TO USE: Do not use for broad exploratory searches (use 'franchise_search_near') or multi-unit franchisee mapping (use 'get_operator_intelligence'). ALTERNATIVES: Use 'get_weekly_scorecard' for the full 6-question review; use 'get_local_share_of_choice' for underlying delivery shelf data.
| Name | Required | Description | Default |
|---|---|---|---|
| store_id | Yes | Target store ID to evaluate tactical recommendations for (e.g. 'loc_mcdonalds_1001') |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Status ('action_ready') |
| store_id | Yes | Store evaluated |
| recommended_action | Yes | Recommended tactical action details with budget and holdout |
| epistemic_foundation | No | Underlying facts and hypotheses |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the tool 'PAID ($0.005)... Atomically debits $0.005', a state-mutating financial side effect that contradicts the provided readOnlyHint=true annotation, and per-call charging also conflicts with idempotentHint=true. Although it usefully discloses auth requirements ('fc_live_...' key) and error semantics (404 no scorecard, 402 insufficient balance), the explicit contradiction with the safety/idempotency annotations forces the floor score.
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 dense but well front-loaded, leading with price/behavior, then constraints, then WHEN TO USE / WHEN NOT / ALTERNATIVES. Nearly every clause earns its place, though the repeated pricing emphasis ('PAID ($0.005)' plus 'Atomically debits $0.005') is somewhat redundant.
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 an output schema present, return values need not be explained, and the description still covers auth, billing, and two error codes plus routing. It is nearly complete for a one-parameter tool; the only real gap is that the behavioral picture conflicts with its own annotations.
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% and there is a single store_id parameter already documented in the schema, so the baseline is 3. The description adds no format or constraint detail about store_id beyond what the schema provides, but it doesn't omit anything either.
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 and artifact ('Synthesize local competitor shifts and digital funnel gaps to formulate a single... tactical intervention with matched holdout test design'), which is far more precise than the name alone. It is clearly distinguishable from siblings like get_weekly_scorecard and get_local_share_of_choice, which are named as different outputs.
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 carries explicit 'WHEN TO USE', 'WHEN NOT TO USE' (routing broad search to franchise_search_near and mapping to get_operator_intelligence), and 'ALTERNATIVES' sections naming specific siblings. An agent has no inference left to do about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_brandsSearch Franchise Brands CatalogARead-onlyIdempotent
FREE. Search and discover indexed restaurant brands across the 500 US franchise database by name, concept, sector, or category. Returns matching chains with total unit counts, category classification, and per-call endpoint pricing. Read-only operation requiring no API key or balance. Rate limit: 60 req/min. WHEN TO USE: Use first when discovering brand slugs or verifying if a chain is indexed in the catalog. WHEN NOT TO USE: Do not use for physical store locations (use 'franchise_search_near' or 'mcdonalds_locations'), corporate filings (use 'get_fdd_item19'), or natural language vector searches (use 'semantic_vector_search'). ALTERNATIVES: Use 'semantic_vector_search' for conceptual similarity; use 'describe_endpoint' to inspect route pricing.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Case-insensitive search query matching brand name, category, or slug (e.g. 'burger', 'coffee', 'taco', 'subway'). If omitted, returns top brands ordered by fleet size. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total matching brands found |
| brands | Yes | List of matching brand summaries with fleet size and API prices |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, but the description adds cost ('FREE'), auth requirements ('no API key or balance'), and a concrete rate limit (60 req/min). That is exactly the extra behavioral context annotations cannot convey.
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?
Front-loaded with the essential verb, resource and cost, then cleanly partitioned into WHEN TO USE / WHEN NOT TO USE / ALTERNATIVES. Dense but every clause carries routing or behavioral information.
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?
An output schema exists, so return values need not be explained; the description nonetheless sketches the return shape (unit counts, category, pricing). Combined with the sibling routing and rate-limit info, nothing an agent needs to call this correctly is missing.
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 value by naming the queryable facets (name, concept, sector, category) and the default behavior when query is omitted, though 'concept, sector' drifts slightly from the schema's 'name, category, slug' wording.
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 ('Search and discover') and resource ('indexed restaurant brands across the 500 US franchise database'), plus the searchable dimensions. An agent can immediately distinguish it from siblings like semantic_vector_search or franchise_search_near.
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?
Explicit WHEN TO USE (discovering brand slugs, verifying catalog indexation), WHEN NOT TO USE with named alternatives for each excluded case (franchise_search_near, mcdonalds_locations, get_fdd_item19, semantic_vector_search), and an ALTERNATIVES line. This is the gold standard for routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
semantic_vector_searchpgvector Semantic Embeddings SearchARead-onlyIdempotent
PAID ($0.005). Perform high-dimensional cosine similarity semantic vector search across multi-unit operators and menu items using embeddings. Atomically debits $0.005. Requires 'fc_live_...' API key. Type defaults to 'operators' if omitted. 'brand' parameter is only applied when type is 'menu'. Returns 402 if balance insufficient. WHEN TO USE: Use for conceptual natural language queries (e.g. 'private equity franchisee groups in Texas' or 'spicy chicken breakfast sandwich'). WHEN NOT TO USE: Do not use for exact brand catalog keyword searches (use 'search_brands') or coordinate proximity searches (use 'franchise_search_near'). ALTERNATIVES: Use 'search_brands' for keyword catalog matching; use 'get_menu_pricing' for exact store menu lookups.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Vector index target: 'operators' for ownership entities (default) or 'menu' for food items | |
| brand | No | Optional canonical brand slug to constrain menu search (e.g. 'mcdonalds', 'chickfila'). Only used when type is 'menu'. | |
| limit | No | Maximum number of nearest-neighbor results to return (default 5, max 20) | |
| query | Yes | Natural language query describing desired operator profile or menu concept (e.g. 'Flynn Restaurant Group Applebees', 'spicy chicken sandwich') |
Output Schema
| Name | Required | Description |
|---|---|---|
| type | Yes | Index target searched ('operators' or 'menu') |
| brand | No | Brand slug constraint if applied |
| query | Yes | Query string executed |
| results | Yes | Nearest-neighbor vector search matches with similarity scores |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses pricing ($0.005 debit), auth requirement ('fc_live_...' key), the 402 insufficient-balance failure mode, default type behavior, and the conditional applicability of the brand parameter. These are side-effect and precondition details that annotations (readOnly/idempotent) do not cover; note the billing debit is a nuance against readOnlyHint but is a billing concern rather than a data mutation.
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?
Front-loads the cost signal and is organized into purpose, mechanics, and routing sections. Slightly redundant in restating the $0.005 debit twice ('PAID ($0.005)' and 'Atomically debits $0.005'), but no sentence is wasted.
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 an output schema present, return values need no explanation, and the description covers cost, auth, failure codes, defaults, and routing for a 4-parameter tool. Nothing an agent needs to call it correctly is missing.
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 schema already documents type, brand, limit, and query semantics. The description adds only the type default ('operators' if omitted) and the brand-only-with-menu rule, both of which are already stated in the schema descriptions, so it does not meaningfully exceed 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?
States a specific verb and resource ('high-dimensional cosine similarity semantic vector search across multi-unit operators and menu items using embeddings') and distinguishes itself from keyword and proximity siblings by name. An agent can identify the tool's function without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit WHEN TO USE with concrete example queries, WHEN NOT TO USE naming two sibling tools by name, and an ALTERNATIVES line mapping each sibling to its purpose. Routing is fully determined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
starbucks_store_statusReal-Time Starbucks Operating StatusARead-onlyIdempotent
PAID ($0.002). Retrieve live operating status, weekly schedule, and current open/closed state for a specific Starbucks store. Atomically debits $0.002 from prepaid balance. Requires 'fc_live_...' API key. If 'store_id' is omitted, defaults to the first indexed store. Returns 404 if store is not found, 402 if balance insufficient. WHEN TO USE: Use to verify whether an individual Starbucks store is currently open or to view its operating schedule. WHEN NOT TO USE: Do not use for fleet-wide location discovery (use 'franchise_search_near' or 'fetch_franchise_data'). ALTERNATIVES: Use 'franchise_search_near' for finding open stores near coordinates; use 'track_brand_changes' for permanent closures.
| Name | Required | Description | Default |
|---|---|---|---|
| store_id | No | Optional Starbucks store identifier or store number (e.g. '1033083', 'loc_starbucks_1033083'). If omitted, inspects the first indexed store. |
Output Schema
| Name | Required | Description |
|---|---|---|
| city | No | City |
| name | No | Store location name |
| hours | No | Weekly operating hours by daypart and weekday |
| state | No | State postal abbreviation |
| status | Yes | Current operating status ('Open' or 'Closed') |
| address | No | Street address |
| store_number | Yes | Store identifier number |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld=false, and the description adds substantial context beyond them: the $0.002 atomic debit from prepaid balance, the required 'fc_live_...' API key, and the 404/402 error semantics. This is exactly the extra behavioral layer the dimension rewards.
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?
Front-loaded with the core capability, cost, and auth before the WHEN TO USE/WHEN NOT blocks. Dense but nearly every sentence earns its place; minor redundancy in stating the paid cost in both the leading tag and the body.
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 single-optional-param read tool with an output schema, the description covers everything an agent needs: cost, auth requirement, default behavior, and error outcomes. Return-value details are correctly left to the output schema.
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 there is only one optional parameter, so the schema already documents the store_id format and default behavior. The description restates the default-to-first-indexed-store behavior without adding format or syntax detail beyond the schema, so the baseline 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?
States a specific verb+resource ('Retrieve live operating status, weekly schedule, and current open/closed state for a specific Starbucks store') with a clearly bounded scope. It is instantly distinguishable from siblings like franchise_search_near or track_brand_changes, which it names explicitly.
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 WHEN TO USE ('verify whether an individual store is currently open or view its schedule'), WHEN NOT TO USE (not for fleet-wide discovery), and ALTERNATIVES naming two specific sibling tools with the conditions that select them. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
topup_creditsMint API Key or Top Up Prepaid CreditsA
Deposit prepaid credits into an existing API key or mint a new key ($1.00 USD minimum, $500.00 max). State-mutating operation that creates or updates database credentials. Requires no prior authentication. Pass 'api_key' to top up an existing key, or omit 'api_key' to mint a fresh key. Returns generated or updated key details and balance in USD. WHEN TO USE: Use when an existing key has exhausted credits, or when a new agent session requires dedicated credentials. WHEN NOT TO USE: Do not use solely to inspect an existing balance without depositing funds; use 'check_balance' instead. ALTERNATIVES: Use 'check_balance' for read-only balance verification without adding credits.
| Name | Required | Description | Default |
|---|---|---|---|
| api_key | No | Optional existing 'fc_live_...' key to top up. If omitted, mints and returns a fresh API key. | |
| amount_usd | Yes | Amount to deposit in USD (minimum 1.00, maximum 500.00, e.g. 5.00). |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | The newly minted API key (only present when creating a new key) |
| message | Yes | Status confirmation message |
| success | No | Whether the credit top-up succeeded |
| balance_usd | Yes | Updated credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, but the description adds meaningful context beyond them: it discloses the mutation's effect (creates or updates database credentials), that no prior authentication is required, the $1–$500 bounds, and the returned key/balance shape. It does not restate non-idempotency explicitly, a minor gap.
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?
Front-loaded with the core action, then scoped by labeled sections that make scanning easy. The only waste is mild overlap between the WHEN NOT TO USE and ALTERNATIVES clauses, both citing check_balance.
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 mutation with annotations and an output schema, the description covers everything an agent needs: mode selection, limits, auth requirement, and mutation effect. Return-value detail is not required since an output schema exists.
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 real behavioral meaning to the optional parameter: passing 'api_key' tops up, omitting it mints a fresh key. That conditional semantics is the crux of correct invocation and is not spelled out as clearly in 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?
States a specific verb+resource with dual scope: 'Deposit prepaid credits into an existing API key or mint a new key.' It clearly distinguishes the two modes of operation and names a sibling (check_balance) so an agent can route correctly without opening a 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?
Explicit WHEN TO USE (exhausted credits, new agent session), WHEN NOT TO USE (balance inspection only), and ALTERNATIVES (check_balance) sections leave nothing to inference. The condition selecting the alternative is stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_brand_changesTrack Fleet Openings, Closures, and RelocationsARead-onlyIdempotent
PAID ($0.003). Audit recent fleet events including permanent closures, new unit openings, and relocations for a brand. Atomically debits $0.003. Requires 'fc_live_...' API key. Returns 402 if balance insufficient. WHEN TO USE: Use for tracking brand footprint expansion, net unit growth velocity, and distress/closure detection. WHEN NOT TO USE: Do not use for real-time daily operating hours (use 'starbucks_store_status'). ALTERNATIVES: Use 'starbucks_store_status' for live store hours; use 'franchise_search_near' for current open units.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Canonical brand slug (e.g. 'subway', 'boston-market', 'hardees', 'starbucks') | |
| event_type | No | Optional event filter: 'opening', 'closure', or 'relocation' |
Output Schema
| Name | Required | Description |
|---|---|---|
| brand | Yes | Brand slug queried |
| changes | Yes | List of recent store opening, closure, or relocation events |
| balance_remaining_usd | Yes | Remaining API credit balance in USD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses cost ($0.003), atomic debit semantics, the required 'fc_live_...' key prefix, and the 402 insufficient-balance failure mode — none of which is inferable from the schema or annotations. This is exactly the side-effect and auth context the structured fields cannot carry. The billing debit is an accounting side effect on the account rather than a mutation of the fleet-event data, so it does not conflict with readOnlyHint=true.
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?
Front-loaded with the paid cost and atomic debit, then the when-to-use routing — good ordering. The WHEN NOT TO USE and ALTERNATIVES sections restate the same 'starbucks_store_status' pointer twice, which is mild redundancy.
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 tool with an output schema, the description covers everything the agent needs: purpose, cost, auth, failure mode, and sibling routing. Return-value shape is delegated to the output schema, so nothing material is missing.
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; the description adds value by glossing 'closure' as 'permanent closures' (distinguishing it from the live-hours sibling) and enumerating the three event types in prose. It does not, however, explain the brand slug format beyond what the schema already states.
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 — auditing recent fleet events (openings, closures, relocations) for a given brand — and the scope is unambiguous. It explicitly differentiates itself from 'starbucks_store_status' (live hours) and 'franchise_search_near' (current open units), so an agent can select it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains explicit WHEN TO USE (footprint expansion, net unit growth velocity, distress/closure detection), WHEN NOT TO USE (real-time daily hours), and named ALTERNATIVES with the conditions that select each. This is a textbook routing block.
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.
17 tool updates
v1.0.1- Changed
check_balance2 fields changed- changed
Input schema / properties / api_key / descriptionPrevious value: -"Optional if Authorization header is set. Your fc_live_... API key."New value: +"Optional if Authorization HTTP header is set. The 'fc_live_...' API key to inspect." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_micro": { + "description": "Balance in micro-USD (1 USD = 1,000,000 micro)", + "type": "integer" + }, + "balance_usd": { + "description": "Formatted USD balance (e.g. '$4.50')", + "type": "string" + }, + "is_active": { + "description": "Whether the API key is active", + "type": "boolean" + }, + "key_prefix": { + "description": "Public key prefix (e.g. 'fc_live_7321...')", + "type": "string" + } + }, + "required": [ + "balance_usd", + "balance_micro", + "is_active" + ], + "type": "object" +}
- Changed
describe_endpoint2 fields changed- changed
Input schema / properties / endpoint / descriptionPrevious value: -"Endpoint path, e.g. '/api/brands/mcdonalds/locations'"New value: +"Target REST API path to inspect (e.g. '/api/brands/mcdonalds/locations', '/api/brands/tacobell/operators')." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "authentication": { + "description": "Accepted authentication headers", + "items": { + "type": "string" + }, + "type": "array" + }, + "endpoint": { + "description": "Requested endpoint path", + "type": "string" + }, + "formats": { + "description": "Supported response formats", + "items": { + "type": "string" + }, + "type": "array" + }, + "pricing": { + "description": "Per-request pricing description", + "type": "string" + }, + "supported_methods": { + "description": "Supported HTTP methods", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "endpoint", + "supported_methods", + "pricing" + ], + "type": "object" +}
- Changed
detect_tech_stack3 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand slug"New value: +"Canonical brand slug (e.g. 'chickfila', 'sweetgreen', 'subway', 'mcdonalds')" - changed
Input schema / properties / store_id / descriptionPrevious value: -"Store ID or store number"New value: +"Unique store number or store ID (e.g. 'loc_subway_1001')" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "tech_stack": { + "description": "Fingerprinted technology components for the location", + "properties": { + "brand_id": { + "type": "string" + }, + "hardware_terminal_model": { + "type": "string" + }, + "kds_system": { + "type": "string" + }, + "online_ordering_gateway": { + "type": "string" + }, + "pos_confidence": { + "type": "number" + }, + "pos_provider": { + "type": "string" + }, + "store_id": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
fetch_franchise_data4 fields changed- changed
Input schema / properties / api_key / descriptionPrevious value: -"Optional if Authorization header is set."New value: +"Optional if Authorization header is set. Your 'fc_live_...' API key." - changed
Input schema / properties / params / descriptionPrevious value: -"Query parameters key-value object (e.g. { city: 'New York', state: 'NY' })"New value: +"Key-value map of URL query parameters (e.g. { 'state': 'CA', 'drive_thru': 'true', 'limit': 10 })." - changed
Input schema / properties / path / descriptionPrevious value: -"Endpoint path (e.g. '/api/brands/mcdonalds/locations')"New value: +"API endpoint route path (e.g. '/api/brands/mcdonalds/locations', '/api/brands/wendys/store/101/status')." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "data": { + "description": "Array of returned record rows from the database", + "type": "array" + }, + "endpoint": { + "description": "Target REST endpoint path executed", + "type": "string" + } + }, + "required": [ + "endpoint", + "data", + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
franchise_search_near5 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Optional filter (e.g. 'Burger', 'Coffee', 'Pizza')"New value: +"Optional category filter (e.g. 'Burger', 'Coffee', 'Pizza', 'Chicken')" - changed
Input schema / properties / lat / descriptionPrevious value: -"Center latitude"New value: +"Center latitude coordinate in decimal degrees (e.g. 41.8781)" - changed
Input schema / properties / lng / descriptionPrevious value: -"Center longitude"New value: +"Center longitude coordinate in decimal degrees (e.g. -87.6298)" - changed
Input schema / properties / radius_miles / descriptionPrevious value: -"Search radius in miles (default 10)"New value: +"Search radius in statute miles (default 10, max 50)" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "center": { + "properties": { + "lat": { + "type": "number" + }, + "lng": { + "type": "number" + }, + "radius": { + "type": "number" + } + }, + "required": [ + "lat", + "lng", + "radius" + ], + "type": "object" + }, + "results": { + "description": "List of nearby restaurant store records across indexed brands", + "items": { + "properties": { + "address": { + "type": "string" + }, + "brand_id": { + "type": "string" + }, + "city": { + "type": "string" + }, + "id": { + "type": "string" + }, + "latitude": { + "type": "number" + }, + "longitude": { + "type": "number" + }, + "name": { + "type": "string" + }, + "state": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "center", + "results", + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
get_fdd_item192 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand slug (e.g. 'mcdonalds', 'chickfila', 'tacobell')"New value: +"Canonical brand slug (e.g. 'chickfila', 'mcdonalds', 'wendys', 'culvers', 'popeyes')" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "brand": { + "description": "Brand slug queried", + "type": "string" + }, + "fdd_item19": { + "description": "FDD Item 19 regulatory financial disclosures", + "properties": { + "ad_fund_pct": { + "type": "number" + }, + "auv_mean": { + "type": "number" + }, + "auv_median": { + "type": "number" + }, + "brand_id": { + "type": "string" + }, + "min_liquid_capital": { + "type": "number" + }, + "royalty_pct": { + "type": "number" + }, + "total_investment_max": { + "type": "number" + }, + "total_investment_min": { + "type": "number" + }, + "year": { + "type": "integer" + } + }, + "type": "object" + } + }, + "required": [ + "brand", + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
get_local_share_of_choice6 fields changed- changed
Input schema / properties / daypart / descriptionPrevious value: -"Optional filter: 'lunch', 'dinner'"New value: +"Optional daypart filter: 'lunch', 'dinner', or 'late_night'" - added
Input schema / properties / daypart / enumAdded value: +[ + "lunch", + "dinner", + "late_night" +] - changed
Input schema / properties / platform / descriptionPrevious value: -"Optional filter: 'doordash', 'ubereats', 'first_party'"New value: +"Optional delivery platform filter: 'doordash', 'ubereats', or 'first_party'" - added
Input schema / properties / platform / enumAdded value: +[ + "doordash", + "ubereats", + "first_party" +] - changed
Input schema / properties / store_id / descriptionPrevious value: -"Store ID (e.g. 'loc_mcdonalds_1001')"New value: +"Target store ID (e.g. 'loc_mcdonalds_1001')" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "focal_delivered_total_usd": { + "description": "Delivered basket total for focal store", + "type": "number" + }, + "observations": { + "description": "List of raw digital shelf observation records", + "type": "array" + }, + "rival_brand": { + "description": "Top rival brand slug", + "type": "string" + }, + "rival_promo_badge": { + "description": "Active promotional badge of rival", + "type": "string" + }, + "store_id": { + "description": "Target store ID", + "type": "string" + }, + "top_rival_delivered_total_usd": { + "description": "Delivered basket total for top competitor", + "type": "number" + }, + "total_observations": { + "description": "Total panel observations recorded", + "type": "integer" + } + }, + "required": [ + "store_id", + "total_observations", + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
get_menu_pricing3 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand slug"New value: +"Canonical brand slug (e.g. 'mcdonalds', 'chipotle', 'subway')" - changed
Input schema / properties / store_id / descriptionPrevious value: -"Store ID or store number"New value: +"Store ID or store number to query localized prices for (e.g. 'loc_mcdonalds_1001')" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "brand": { + "description": "Brand slug", + "type": "string" + }, + "items": { + "description": "List of localized menu items with pricing and national variance", + "items": { + "properties": { + "category": { + "type": "string" + }, + "item_name": { + "type": "string" + }, + "national_baseline_usd": { + "type": "number" + }, + "price_usd": { + "type": "number" + }, + "variance_pct": { + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + }, + "store_id": { + "description": "Store identifier", + "type": "string" + } + }, + "required": [ + "store_id", + "brand", + "items", + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
get_operator_intelligence4 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand slug (e.g. 'tacobell', 'mcdonalds', 'wendys')"New value: +"Canonical brand slug (e.g. 'tacobell', 'applebees', 'wendys'). Used when querying by store." - changed
Input schema / properties / operator_id / descriptionPrevious value: -"Optional direct operator ID"New value: +"Direct operator entity ID (e.g. 'op_flynn_group'). Provide this OR provide both 'brand' and 'store_id'." - changed
Input schema / properties / store_id / descriptionPrevious value: -"Store ID or store number"New value: +"Store ID (e.g. 'loc_tacobell_1001') to look up controlling franchisee." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "operator": { + "description": "Full operator profile when queried by operator_id", + "properties": { + "annual_revenue_usd": { + "type": "number" + }, + "dba_name": { + "type": "string" + }, + "headquarters": { + "type": "string" + }, + "id": { + "type": "string" + }, + "legal_name": { + "type": "string" + }, + "total_units": { + "type": "integer" + } + }, + "type": "object" + }, + "operators": { + "description": "List of operator associations when queried by brand/store", + "items": { + "properties": { + "annual_revenue_usd": { + "type": "number" + }, + "contact_role": { + "type": "string" + }, + "dba_name": { + "type": "string" + }, + "headquarters": { + "type": "string" + }, + "legal_name": { + "type": "string" + }, + "operator_id": { + "type": "string" + }, + "total_units": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
get_weekly_scorecard3 fields changed- changed
Input schema / properties / store_id / descriptionPrevious value: -"Store ID"New value: +"Target store ID or store number (e.g. 'loc_mcdonalds_1001')" - changed
Input schema / properties / week / descriptionPrevious value: -"Optional week identifier (e.g. '2026-W36')"New value: +"Optional week identifier in ISO format (e.g. '2026-W36'). If omitted, defaults to the most recent week." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "question_1_what_changed": { + "description": "Funnel conversion and traffic deltas", + "type": "object" + }, + "question_2_why_did_it_change": { + "description": "Driver diagnostics and decomposition", + "type": "object" + }, + "question_3_competitor_moves": { + "description": "Local competitor pricing and promotional shifts", + "type": "object" + }, + "question_4_fact_vs_inference": { + "description": "Separation of observed facts vs testable inferences", + "type": "object" + }, + "question_5_recommended_action": { + "description": "Single controllable tactical intervention", + "type": "object" + }, + "question_6_holdout_evaluation": { + "description": "Empirical holdout evaluation from prior week", + "type": "object" + }, + "store_id": { + "description": "Store identifier", + "type": "string" + }, + "week": { + "description": "Evaluated week identifier", + "type": "string" + } + }, + "required": [ + "store_id", + "week", + "question_1_what_changed", + "question_5_recommended_action", + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
mcdonalds_locations6 fields changed- changed
Input schema / properties / city / descriptionPrevious value: -"City name"New value: +"City name to filter stores by (e.g. 'Chicago', 'Dallas')" - changed
Input schema / properties / drive_thru / descriptionPrevious value: -"Filter for drive-thru only"New value: +"Filter exclusively for stores with verified drive-thru lanes" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (default 25)"New value: +"Maximum number of store records to return (default 25, max 50)" - changed
Input schema / properties / state / descriptionPrevious value: -"Two-letter state code, e.g. 'CA', 'NY'"New value: +"Two-letter US state postal code (e.g. 'IL', 'TX', 'CA')" - changed
Input schema / properties / zip / descriptionPrevious value: -"Postal zip code"New value: +"Five-digit US postal ZIP code (e.g. '60601')" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "brand": { + "description": "Brand name ('McDonald\\'s')", + "type": "string" + }, + "count": { + "description": "Number of matching locations found", + "type": "integer" + }, + "locations": { + "description": "List of McDonald's store records matching filters", + "items": { + "properties": { + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "has_drive_thru": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "latitude": { + "type": "number" + }, + "longitude": { + "type": "number" + }, + "state": { + "type": "string" + }, + "store_number": { + "type": "string" + }, + "zip": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "brand", + "count", + "balance_remaining_usd", + "locations" + ], + "type": "object" +}
- Changed
recommend_local_action2 fields changed- changed
Input schema / properties / store_id / descriptionPrevious value: -"Store ID"New value: +"Target store ID to evaluate tactical recommendations for (e.g. 'loc_mcdonalds_1001')" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "epistemic_foundation": { + "description": "Underlying facts and hypotheses", + "properties": { + "observed_facts": { + "items": { + "type": "string" + }, + "type": "array" + }, + "testable_inferences": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "recommended_action": { + "description": "Recommended tactical action details with budget and holdout", + "properties": { + "description": { + "type": "string" + }, + "expected_margin_impact_pct": { + "type": "number" + }, + "guardrail_max_budget_usd": { + "type": "number" + }, + "holdout_store_id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "status": { + "description": "Status ('action_ready')", + "type": "string" + }, + "store_id": { + "description": "Store evaluated", + "type": "string" + } + }, + "required": [ + "store_id", + "status", + "recommended_action", + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
search_brands2 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Optional search query (e.g. 'burger', 'coffee', 'pizza')"New value: +"Case-insensitive search query matching brand name, category, or slug (e.g. 'burger', 'coffee', 'taco', 'subway'). If omitted, returns top brands ordered by fleet size." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "brands": { + "description": "List of matching brand summaries with fleet size and API prices", + "items": { + "properties": { + "category": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "price_per_call": { + "type": "number" + }, + "slug": { + "type": "string" + }, + "tagline": { + "type": "string" + }, + "total_locations": { + "type": "integer" + }, + "website": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Total matching brands found", + "type": "integer" + } + }, + "required": [ + "total", + "brands" + ], + "type": "object" +}
- Changed
semantic_vector_search5 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand slug if searching menu items (e.g. 'mcdonalds')"New value: +"Optional canonical brand slug to constrain menu search (e.g. 'mcdonalds', 'chickfila'). Only used when type is 'menu'." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (default: 5)"New value: +"Maximum number of nearest-neighbor results to return (default 5, max 20)" - changed
Input schema / properties / query / descriptionPrevious value: -"Natural language search query (e.g. 'Flynn Taco Bell', 'Big Mac')"New value: +"Natural language query describing desired operator profile or menu concept (e.g. 'Flynn Restaurant Group Applebees', 'spicy chicken sandwich')" - changed
Input schema / properties / type / descriptionPrevious value: -"Search target: 'operators' or 'menu'"New value: +"Vector index target: 'operators' for ownership entities (default) or 'menu' for food items" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "brand": { + "description": "Brand slug constraint if applied", + "type": "string" + }, + "query": { + "description": "Query string executed", + "type": "string" + }, + "results": { + "description": "Nearest-neighbor vector search matches with similarity scores", + "type": "array" + }, + "type": { + "description": "Index target searched ('operators' or 'menu')", + "type": "string" + } + }, + "required": [ + "query", + "type", + "results", + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
starbucks_store_status3 fields changed- changed
Input schema / properties / store_id / descriptionPrevious value: -"Store ID or store number, e.g. 'STA-1002'"New value: +"Optional Starbucks store identifier or store number (e.g. '1033083', 'loc_starbucks_1033083'). If omitted, inspects the first indexed store." - removed
Input schema / requiredRemoved value: -[ - "store_id" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "address": { + "description": "Street address", + "type": "string" + }, + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "city": { + "description": "City", + "type": "string" + }, + "hours": { + "description": "Weekly operating hours by daypart and weekday", + "type": "object" + }, + "name": { + "description": "Store location name", + "type": "string" + }, + "state": { + "description": "State postal abbreviation", + "type": "string" + }, + "status": { + "description": "Current operating status ('Open' or 'Closed')", + "type": "string" + }, + "store_number": { + "description": "Store identifier number", + "type": "string" + } + }, + "required": [ + "store_number", + "status", + "balance_remaining_usd" + ], + "type": "object" +}
- Changed
topup_credits4 fields changed- changed
Input schema / properties / amount_usd / descriptionPrevious value: -"Amount in USD (minimum $1.00)"New value: +"Amount to deposit in USD (minimum 1.00, maximum 500.00, e.g. 5.00)." - changed
Input schema / properties / api_key / descriptionPrevious value: -"Optional existing key to top up. If omitted, mints a new key."New value: +"Optional existing 'fc_live_...' key to top up. If omitted, mints and returns a fresh API key." - added
Input schema / requiredAdded value: +[ + "amount_usd" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_usd": { + "description": "Updated credit balance in USD", + "type": "string" + }, + "key": { + "description": "The newly minted API key (only present when creating a new key)", + "type": "string" + }, + "message": { + "description": "Status confirmation message", + "type": "string" + }, + "success": { + "description": "Whether the credit top-up succeeded", + "type": "boolean" + } + }, + "required": [ + "message", + "balance_usd" + ], + "type": "object" +}
- Changed
track_brand_changes4 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand slug"New value: +"Canonical brand slug (e.g. 'subway', 'boston-market', 'hardees', 'starbucks')" - changed
Input schema / properties / event_type / descriptionPrevious value: -"Optional filter: 'opening', 'closure', 'relocation'"New value: +"Optional event filter: 'opening', 'closure', or 'relocation'" - added
Input schema / properties / event_type / enumAdded value: +[ + "opening", + "closure", + "relocation" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "balance_remaining_usd": { + "description": "Remaining API credit balance in USD", + "type": "string" + }, + "brand": { + "description": "Brand slug queried", + "type": "string" + }, + "changes": { + "description": "List of recent store opening, closure, or relocation events", + "items": { + "properties": { + "address": { + "type": "string" + }, + "brand_id": { + "type": "string" + }, + "city": { + "type": "string" + }, + "effective_date": { + "type": "string" + }, + "event_type": { + "type": "string" + }, + "state": { + "type": "string" + }, + "store_id": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "brand", + "changes", + "balance_remaining_usd" + ], + "type": "object" +}
17 tool updates
v1.0.0- First observed
check_balance - First observed
describe_endpoint - First observed
detect_tech_stack - First observed
fetch_franchise_data - First observed
franchise_search_near - First observed
get_fdd_item19 - First observed
get_local_share_of_choice - First observed
get_menu_pricing - First observed
get_operator_intelligence - First observed
get_weekly_scorecard - First observed
mcdonalds_locations - First observed
recommend_local_action - First observed
search_brands - First observed
semantic_vector_search - First observed
starbucks_store_status - First observed
topup_credits - First observed
track_brand_changes
TDQS
Scored across 17 tools
Descriptions include explicit WHEN TO USE / WHEN NOT TO USE / ALTERNATIVES sections, making most boundaries clear (e.g. mcdonalds_locations vs franchise_search_near, search_brands vs semantic_vector_search). Minor overlap remains among the analytics tools (get_weekly_scorecard vs recommend_local_action, and get_local_share_of_choice vs get_menu_pricing both touch delivery pricing), but the cross-references largely resolve it.
Predominantly snake_case with clear verb_noun structure (search_brands, get_operator_intelligence, detect_tech_stack, track_brand_changes). Deviations are brand-prefixed or noun-only names (mcdonalds_locations, starbucks_store_status, semantic_vector_search) which break the pattern but stay readable and snake_case.
17 tools is slightly above the ideal range but each targets a distinct data source or operation, so they mostly earn their place. The generic fetch_franchise_data escape hatch coexists sensibly with the specialized shortcuts.
Strong coverage of discovery, endpoints, billing, geolocation, operator intelligence, tech stack, brand change tracking, menu pricing, FDD financials, delivery share, and operational scorecards. Read-oriented surface is fairly complete; a dedicated single-brand detail tool and more lifecycle/write operations are minor gaps.
Maintenance
Related MCP Connectors
Pre-opening US restaurant and bar leads, scored from liquor, permit and business filings.
- mcpOAuthai.factori
Real-world location intelligence: foot traffic, trade areas, demographics, site scoring, and more.
OSM-sourced local business data across 9 niches — cuisine, dietary options, delivery, accessibility.
Local business intel for AI agents: audits, lead scoring, tech stack, prospecting.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides hospitality intelligence tools for restaurant optimization, including menu profitability analysis, food cost calculation, reservation management, review sentiment analysis, and allergen checking.1 npm54 PyPIMIT
- AlicenseAqualityDmaintenanceFranchise evaluation tools built from 81+ closed deals. Validate FDD investment ranges, identify red flags, assess readiness, and connect with a free franchise consultant. E-2 visa guide in English and Spanish.84 npmMIT
- AlicenseAqualityDmaintenanceRegulatory intelligence API — look up permits, licenses, and fees for food service businesses in Austin, SF, and NYC.317 npmMIT
- FlicenseNot gradedqualityDmaintenanceThe owner-verified local business data + service & menu-price layer for AI agents. Owner-authored business profiles where every response carries provenance — verification level, completeness score, freshness timestamps, and upstream sources. * Search & profiles — find businesses by name, category, city, or geo-radius; full profiles with contacts, hours, media, ratings. * Price layer-