Skip to main content
Glama

franchisedata-mcp

npm version License: MIT Glama MCP Tools Chains Locations

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 claude

2. 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: franchisedata

  • Type: command

  • Command: 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

FRANCHISE_MODE=discovery

6 tools

Brand discovery, catalog lookups, and endpoint exploration. Minimal token footprint (~1,200 tokens).

FRANCHISE_MODE=diligence

10 tools

Underwriting, commercial due diligence, FDD Item 19 analysis, and operator portfolios.

FRANCHISE_MODE=operations

13 tools

Store-level operations, POS hardware fingerprints, aggregator visibility, and live status.

FRANCHISE_MODE=all (default)

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

search_brands

FREE

Catalog

Search all 500 indexed chains by concept, sector, or category.

describe_endpoint

FREE

Catalog

Inspect schema, parameters, and pricing for any REST API endpoint.

check_balance

FREE

Catalog

Read-only check of remaining credit balance in USD.

topup_credits

State-Mutating

Catalog

Mint a new API key ($1.00 min) or top up prepaid credits.

fetch_franchise_data

Universal

Catalog

Parameterized runner calling any REST endpoint when dedicated tool is not present.

semantic_vector_search

PAID ($0.005)

Catalog

pgvector cosine similarity search across multi-unit operators and menu items.

get_fdd_item19

PAID ($0.010)

Financials

Statutory Item 19 AUV quartiles, royalty fee %, and EBITDA benchmarks.

get_operator_intelligence

PAID ($0.005)

Financials

Multi-unit franchisee holding LLCs, PE backing, and store fleet counts.

track_brand_changes

PAID ($0.003)

Financials

Real-time audit log of store openings, permanent closures, and fleet relocations.

get_menu_pricing

PAID ($0.003)

Financials

Localized menu item pricing, national benchmarks, and price variance analysis.

mcdonalds_locations

PAID ($0.003)

Locations

Fast lookup of McDonald's stores with drive-thru, 24h, and PlayPlace filters.

starbucks_store_status

PAID ($0.002)

Locations

Real-time operating hours, active open/closed status, and store features.

franchise_search_near

PAID ($0.005)

Locations

Radial cross-brand coordinate search (up to 50 miles) for open restaurant locations.

detect_tech_stack

PAID ($0.003)

Intelligence

Fingerprint POS (Toast, Aloha, Brink), KDS, and online ordering gateways.

get_local_share_of_choice

PAID ($0.005)

Intelligence

Hyperlocal digital shelf observations across DoorDash, Uber Eats, and 1P web.

get_weekly_scorecard

PAID ($0.010)

Intelligence

Standardized 6-Question Weekly Operating Review Scorecard for store diagnostics.

recommend_local_action

PAID ($0.005)

Intelligence

Margin-guardrailed tactical interventions with holdout test design.


⚙️ Environment Variables

Variable

Default

Description

FRANCHISE_API_KEY

""

Optional fc_live_... API key for Pro tier unmasking. Get one at franchisedata.io/topup.

FRANCHISE_API_URL

https://franchisedata.io/api/mcp

Upstream JSON-RPC endpoint.

FRANCHISE_MODE

all

Scoping mode: all, discovery, diligence, operations.

FRANCHISE_COMPACT

true

Toggles automatic null-pruning and token reduction.

FRANCHISE_TIMEOUT_MS

30000

HTTP request timeout in milliseconds.

FRANCHISE_MAX_RETRIES

3

Maximum exponential backoff retry attempts.


📄 License

MIT © Outis Co

Available Tools

17 tools
check_balanceCheck API Credit BalanceA
Read-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.

NameRequiredDescriptionDefault
api_keyNoOptional if Authorization HTTP header is set. The 'fc_live_...' API key to inspect.

Output Schema

NameRequiredDescription
is_activeYesWhether the API key is active
key_prefixNoPublic key prefix (e.g. 'fc_live_7321...')
balance_usdYesFormatted USD balance (e.g. '$4.50')
balance_microYesBalance in micro-USD (1 USD = 1,000,000 micro)

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PricingA
Read-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.

NameRequiredDescriptionDefault
endpointYesTarget REST API path to inspect (e.g. '/api/brands/mcdonalds/locations', '/api/brands/tacobell/operators').

Output Schema

NameRequiredDescription
formatsNoSupported response formats
pricingYesPer-request pricing description
endpointYesRequested endpoint path
authenticationNoAccepted authentication headers
supported_methodsYesSupported HTTP methods

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 StackA
Read-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.

NameRequiredDescriptionDefault
brandYesCanonical brand slug (e.g. 'chickfila', 'sweetgreen', 'subway', 'mcdonalds')
store_idYesUnique store number or store ID (e.g. 'loc_subway_1001')

Output Schema

NameRequiredDescription
tech_stackNoFingerprinted technology components for the location
balance_remaining_usdYesRemaining API credit balance in USD

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 RunnerA
Read-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.

NameRequiredDescriptionDefault
pathYesAPI endpoint route path (e.g. '/api/brands/mcdonalds/locations', '/api/brands/wendys/store/101/status').
paramsNoKey-value map of URL query parameters (e.g. { 'state': 'CA', 'drive_thru': 'true', 'limit': 10 }).
api_keyNoOptional if Authorization header is set. Your 'fc_live_...' API key.

Output Schema

NameRequiredDescription
dataYesArray of returned record rows from the database
endpointYesTarget REST endpoint path executed
balance_remaining_usdYesRemaining API credit balance in USD

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SearchA
Read-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.

NameRequiredDescriptionDefault
latYesCenter latitude coordinate in decimal degrees (e.g. 41.8781)
lngYesCenter longitude coordinate in decimal degrees (e.g. -87.6298)
categoryNoOptional category filter (e.g. 'Burger', 'Coffee', 'Pizza', 'Chicken')
radius_milesNoSearch radius in statute miles (default 10, max 50)

Output Schema

NameRequiredDescription
centerYes
resultsYesList of nearby restaurant store records across indexed brands
balance_remaining_usdYesRemaining API credit balance in USD

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 EconomicsA
Read-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.

NameRequiredDescriptionDefault
brandYesCanonical brand slug (e.g. 'chickfila', 'mcdonalds', 'wendys', 'culvers', 'popeyes')

Output Schema

NameRequiredDescription
brandYesBrand slug queried
fdd_item19NoFDD Item 19 regulatory financial disclosures
balance_remaining_usdYesRemaining API credit balance in USD

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_local_share_of_choiceHyperlocal Digital Shelf Share of ChoiceA
Read-onlyIdempotent

PAID ($0.005). Query local digital shelf telemetry from DoorDash, Uber Eats, and 1st-party apps, including delivered basket price gaps, delivery ETA disparities, and organic vs sponsored placement. Atomically debits $0.005. Requires 'fc_live_...' API key. Returns 402 if balance insufficient. WHEN TO USE: Use to diagnose delivery channel share loss, competitor promotion surges, and aggregator markup disparities. WHEN NOT TO USE: Do not use for static national FDD disclosures (use 'get_fdd_item19'). ALTERNATIVES: Use 'recommend_local_action' to generate guardrailed tactical responses based on shelf telemetry; use 'get_menu_pricing' for in-store menu pricing.

NameRequiredDescriptionDefault
daypartNoOptional daypart filter: 'lunch', 'dinner', or 'late_night'
platformNoOptional delivery platform filter: 'doordash', 'ubereats', or 'first_party'
store_idYesTarget store ID (e.g. 'loc_mcdonalds_1001')

Output Schema

NameRequiredDescription
store_idYesTarget store ID
rival_brandNoTop rival brand slug
observationsNoList of raw digital shelf observation records
rival_promo_badgeNoActive promotional badge of rival
total_observationsYesTotal panel observations recorded
balance_remaining_usdYesRemaining API credit balance in USD
focal_delivered_total_usdNoDelivered basket total for focal store
top_rival_delivered_total_usdNoDelivered basket total for top competitor

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the read-only/idempotent annotations, it discloses cost ($0.005), atomic debit semantics, required 'fc_live_...' key format, and the 402 failure mode for insufficient balance. This is exactly the operational context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads cost and purpose, then structures use/avoid/alternatives into labeled clauses. Dense but every sentence carries routing or behavioral information.

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

Completeness5/5

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

With an output schema present, the description need not explain return values, and it covers cost, auth, failure mode, and sibling routing. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with documented enums, so the baseline is 3. The description adds no parameter-level detail (no explanation of daypart/platform/store_id semantics) beyond naming the data domains.

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

Purpose5/5

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

States a specific verb and resource ('Query local digital shelf telemetry') and enumerates the concrete data returned: price gaps, ETA disparities, organic vs sponsored placement. It is clearly distinguishable from siblings like get_fdd_item19 or get_menu_pricing.

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

Usage Guidelines5/5

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

Provides explicit WHEN TO USE (delivery channel share loss, competitor promotion surges, aggregator markup disparities), WHEN NOT TO USE (static national FDD disclosures -> get_fdd_item19), and ALTERNATIVES (recommend_local_action, get_menu_pricing). Routing is fully specified.

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

get_menu_pricingRetrieve Store Menu Pricing and Price VarianceA
Read-onlyIdempotent

PAID ($0.003). Extract localized menu item prices, benchmark variances against national averages, and identify delivery aggregator price markups. Atomically debits $0.003. Requires 'fc_live_...' API key. Returns 402 if balance insufficient. WHEN TO USE: Use for local pricing strategy audits, inflation index tracking, and menu margin variance analysis. WHEN NOT TO USE: Do not use for delivery shelf placement rankings (use 'get_local_share_of_choice'). ALTERNATIVES: Use 'get_local_share_of_choice' for DoorDash/UberEats basket comparisons; use 'get_fdd_item19' for national revenue benchmarks.

NameRequiredDescriptionDefault
brandYesCanonical brand slug (e.g. 'mcdonalds', 'chipotle', 'subway')
store_idYesStore ID or store number to query localized prices for (e.g. 'loc_mcdonalds_1001')

Output Schema

NameRequiredDescription
brandYesBrand slug
itemsYesList of localized menu items with pricing and national variance
store_idYesStore identifier
balance_remaining_usdYesRemaining API credit balance in USD

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint, idempotentHint, openWorldHint=false), and the description adds substantial context beyond them: a $0.003 cost, atomic debit semantics, the required 'fc_live_...' API key format, and the 402 insufficient-balance failure mode. This is exactly the billing/auth behavior an agent needs and cannot get from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the paid cost and core capability, then usage, then routing, all in a compact block. Slight redundancy in stating the $0.003 price twice ('PAID ($0.003)' and 'Atomically debits $0.003'), which keeps it just short of a 5.

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

Completeness5/5

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

For a two-param, paid, read-only lookup with an output schema present, the description covers cost, auth, failure mode, and routing without needing to describe return values. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with only two parameters, so the schema already documents 'brand' (with slug examples) and 'store_id' (with example ID). The description adds no parameter-level syntax or format detail beyond that. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose5/5

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

States specific verbs and resources — extract localized menu prices, benchmark variances, identify delivery markups — and names the exact siblings it is not (get_local_share_of_choice, get_fdd_item19). An agent can distinguish it from every 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.

Usage Guidelines5/5

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

Explicit WHEN TO USE (pricing audits, inflation tracking, margin variance), WHEN NOT TO USE with the alternative named for the excluded case, and an ALTERNATIVES line routing to two specific sibling tools by use case. 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 IntelligenceA
Read-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.

NameRequiredDescriptionDefault
brandNoCanonical brand slug (e.g. 'tacobell', 'applebees', 'wendys'). Used when querying by store.
store_idNoStore ID (e.g. 'loc_tacobell_1001') to look up controlling franchisee.
operator_idNoDirect operator entity ID (e.g. 'op_flynn_group'). Provide this OR provide both 'brand' and 'store_id'.

Output Schema

NameRequiredDescription
operatorNoFull operator profile when queried by operator_id
operatorsNoList of operator associations when queried by brand/store
balance_remaining_usdYesRemaining API credit balance in USD

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ScorecardA
Read-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.

NameRequiredDescriptionDefault
weekNoOptional week identifier in ISO format (e.g. '2026-W36'). If omitted, defaults to the most recent week.
store_idYesTarget store ID or store number (e.g. 'loc_mcdonalds_1001')

Output Schema

NameRequiredDescription
weekYesEvaluated week identifier
store_idYesStore identifier
balance_remaining_usdYesRemaining API credit balance in USD
question_1_what_changedYesFunnel conversion and traffic deltas
question_3_competitor_movesNoLocal competitor pricing and promotional shifts
question_2_why_did_it_changeNoDriver diagnostics and decomposition
question_4_fact_vs_inferenceNoSeparation of observed facts vs testable inferences
question_5_recommended_actionYesSingle controllable tactical intervention
question_6_holdout_evaluationNoEmpirical holdout evaluation from prior week

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 LocationsA
Read-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.

NameRequiredDescriptionDefault
zipNoFive-digit US postal ZIP code (e.g. '60601')
cityNoCity name to filter stores by (e.g. 'Chicago', 'Dallas')
limitNoMaximum number of store records to return (default 25, max 50)
stateNoTwo-letter US state postal code (e.g. 'IL', 'TX', 'CA')
drive_thruNoFilter exclusively for stores with verified drive-thru lanes

Output Schema

NameRequiredDescription
brandYesBrand name ('McDonald\'s')
countYesNumber of matching locations found
locationsYesList of McDonald's store records matching filters
balance_remaining_usdYesRemaining API credit balance in USD

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ActionA
Read-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.

NameRequiredDescriptionDefault
store_idYesTarget store ID to evaluate tactical recommendations for (e.g. 'loc_mcdonalds_1001')

Output Schema

NameRequiredDescription
statusYesStatus ('action_ready')
store_idYesStore evaluated
recommended_actionYesRecommended tactical action details with budget and holdout
epistemic_foundationNoUnderlying facts and hypotheses
balance_remaining_usdYesRemaining API credit balance in USD

TDQS

A3.7/5.0
Behavior1/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 CatalogA
Read-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.

NameRequiredDescriptionDefault
queryNoCase-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

NameRequiredDescription
totalYesTotal matching brands found
brandsYesList of matching brand summaries with fleet size and API prices

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

starbucks_store_statusReal-Time Starbucks Operating StatusA
Read-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.

NameRequiredDescriptionDefault
store_idNoOptional Starbucks store identifier or store number (e.g. '1033083', 'loc_starbucks_1033083'). If omitted, inspects the first indexed store.

Output Schema

NameRequiredDescription
cityNoCity
nameNoStore location name
hoursNoWeekly operating hours by daypart and weekday
stateNoState postal abbreviation
statusYesCurrent operating status ('Open' or 'Closed')
addressNoStreet address
store_numberYesStore identifier number
balance_remaining_usdYesRemaining API credit balance in USD

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
api_keyNoOptional existing 'fc_live_...' key to top up. If omitted, mints and returns a fresh API key.
amount_usdYesAmount to deposit in USD (minimum 1.00, maximum 500.00, e.g. 5.00).

Output Schema

NameRequiredDescription
keyNoThe newly minted API key (only present when creating a new key)
messageYesStatus confirmation message
successNoWhether the credit top-up succeeded
balance_usdYesUpdated credit balance in USD

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 RelocationsA
Read-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.

NameRequiredDescriptionDefault
brandYesCanonical brand slug (e.g. 'subway', 'boston-market', 'hardees', 'starbucks')
event_typeNoOptional event filter: 'opening', 'closure', or 'relocation'

Output Schema

NameRequiredDescription
brandYesBrand slug queried
changesYesList of recent store opening, closure, or relocation events
balance_remaining_usdYesRemaining API credit balance in USD

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 17 tool updatesv1.0.1
    • Changedcheck_balance2 fields changed
      • changedInput schema / properties / api_key / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changeddescribe_endpoint2 fields changed
      • changedInput schema / properties / endpoint / description
        Previous 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')."
      • changedOutput 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"
        +}
    • Changeddetect_tech_stack3 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand slug"New value: +"Canonical brand slug (e.g. 'chickfila', 'sweetgreen', 'subway', 'mcdonalds')"
      • changedInput schema / properties / store_id / description
        Previous value: -"Store ID or store number"New value: +"Unique store number or store ID (e.g. 'loc_subway_1001')"
      • changedOutput 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"
        +}
    • Changedfetch_franchise_data4 fields changed
      • changedInput schema / properties / api_key / description
        Previous value: -"Optional if Authorization header is set."New value: +"Optional if Authorization header is set. Your 'fc_live_...' API key."
      • changedInput schema / properties / params / description
        Previous 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 })."
      • changedInput schema / properties / path / description
        Previous 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')."
      • changedOutput 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"
        +}
    • Changedfranchise_search_near5 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Optional filter (e.g. 'Burger', 'Coffee', 'Pizza')"New value: +"Optional category filter (e.g. 'Burger', 'Coffee', 'Pizza', 'Chicken')"
      • changedInput schema / properties / lat / description
        Previous value: -"Center latitude"New value: +"Center latitude coordinate in decimal degrees (e.g. 41.8781)"
      • changedInput schema / properties / lng / description
        Previous value: -"Center longitude"New value: +"Center longitude coordinate in decimal degrees (e.g. -87.6298)"
      • changedInput schema / properties / radius_miles / description
        Previous value: -"Search radius in miles (default 10)"New value: +"Search radius in statute miles (default 10, max 50)"
      • changedOutput 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"
        +}
    • Changedget_fdd_item192 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand slug (e.g. 'mcdonalds', 'chickfila', 'tacobell')"New value: +"Canonical brand slug (e.g. 'chickfila', 'mcdonalds', 'wendys', 'culvers', 'popeyes')"
      • changedOutput 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"
        +}
    • Changedget_local_share_of_choice6 fields changed
      • changedInput schema / properties / daypart / description
        Previous value: -"Optional filter: 'lunch', 'dinner'"New value: +"Optional daypart filter: 'lunch', 'dinner', or 'late_night'"
      • addedInput schema / properties / daypart / enum
        Added value: +[
        +  "lunch",
        +  "dinner",
        +  "late_night"
        +]
      • changedInput schema / properties / platform / description
        Previous value: -"Optional filter: 'doordash', 'ubereats', 'first_party'"New value: +"Optional delivery platform filter: 'doordash', 'ubereats', or 'first_party'"
      • addedInput schema / properties / platform / enum
        Added value: +[
        +  "doordash",
        +  "ubereats",
        +  "first_party"
        +]
      • changedInput schema / properties / store_id / description
        Previous value: -"Store ID (e.g. 'loc_mcdonalds_1001')"New value: +"Target store ID (e.g. 'loc_mcdonalds_1001')"
      • changedOutput 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"
        +}
    • Changedget_menu_pricing3 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand slug"New value: +"Canonical brand slug (e.g. 'mcdonalds', 'chipotle', 'subway')"
      • changedInput schema / properties / store_id / description
        Previous value: -"Store ID or store number"New value: +"Store ID or store number to query localized prices for (e.g. 'loc_mcdonalds_1001')"
      • changedOutput 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"
        +}
    • Changedget_operator_intelligence4 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand slug (e.g. 'tacobell', 'mcdonalds', 'wendys')"New value: +"Canonical brand slug (e.g. 'tacobell', 'applebees', 'wendys'). Used when querying by store."
      • changedInput schema / properties / operator_id / description
        Previous 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'."
      • changedInput schema / properties / store_id / description
        Previous value: -"Store ID or store number"New value: +"Store ID (e.g. 'loc_tacobell_1001') to look up controlling franchisee."
      • changedOutput 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"
        +}
    • Changedget_weekly_scorecard3 fields changed
      • changedInput schema / properties / store_id / description
        Previous value: -"Store ID"New value: +"Target store ID or store number (e.g. 'loc_mcdonalds_1001')"
      • changedInput schema / properties / week / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedmcdonalds_locations6 fields changed
      • changedInput schema / properties / city / description
        Previous value: -"City name"New value: +"City name to filter stores by (e.g. 'Chicago', 'Dallas')"
      • changedInput schema / properties / drive_thru / description
        Previous value: -"Filter for drive-thru only"New value: +"Filter exclusively for stores with verified drive-thru lanes"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (default 25)"New value: +"Maximum number of store records to return (default 25, max 50)"
      • changedInput schema / properties / state / description
        Previous value: -"Two-letter state code, e.g. 'CA', 'NY'"New value: +"Two-letter US state postal code (e.g. 'IL', 'TX', 'CA')"
      • changedInput schema / properties / zip / description
        Previous value: -"Postal zip code"New value: +"Five-digit US postal ZIP code (e.g. '60601')"
      • changedOutput 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"
        +}
    • Changedrecommend_local_action2 fields changed
      • changedInput schema / properties / store_id / description
        Previous value: -"Store ID"New value: +"Target store ID to evaluate tactical recommendations for (e.g. 'loc_mcdonalds_1001')"
      • changedOutput 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"
        +}
    • Changedsearch_brands2 fields changed
      • changedInput schema / properties / query / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedsemantic_vector_search5 fields changed
      • changedInput schema / properties / brand / description
        Previous 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'."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (default: 5)"New value: +"Maximum number of nearest-neighbor results to return (default 5, max 20)"
      • changedInput schema / properties / query / description
        Previous 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')"
      • changedInput schema / properties / type / description
        Previous value: -"Search target: 'operators' or 'menu'"New value: +"Vector index target: 'operators' for ownership entities (default) or 'menu' for food items"
      • changedOutput 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"
        +}
    • Changedstarbucks_store_status3 fields changed
      • changedInput schema / properties / store_id / description
        Previous 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."
      • removedInput schema / required
        Removed value: -[
        -  "store_id"
        -]
      • changedOutput 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"
        +}
    • Changedtopup_credits4 fields changed
      • changedInput schema / properties / amount_usd / description
        Previous value: -"Amount in USD (minimum $1.00)"New value: +"Amount to deposit in USD (minimum 1.00, maximum 500.00, e.g. 5.00)."
      • changedInput schema / properties / api_key / description
        Previous 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."
      • addedInput schema / required
        Added value: +[
        +  "amount_usd"
        +]
      • changedOutput 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"
        +}
    • Changedtrack_brand_changes4 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand slug"New value: +"Canonical brand slug (e.g. 'subway', 'boston-market', 'hardees', 'starbucks')"
      • changedInput schema / properties / event_type / description
        Previous value: -"Optional filter: 'opening', 'closure', 'relocation'"New value: +"Optional event filter: 'opening', 'closure', or 'relocation'"
      • addedInput schema / properties / event_type / enum
        Added value: +[
        +  "opening",
        +  "closure",
        +  "relocation"
        +]
      • changedOutput 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"
        +}
  2. 17 tool updatesv1.0.0
    • First observedcheck_balance
    • First observeddescribe_endpoint
    • First observeddetect_tech_stack
    • First observedfetch_franchise_data
    • First observedfranchise_search_near
    • First observedget_fdd_item19
    • First observedget_local_share_of_choice
    • First observedget_menu_pricing
    • First observedget_operator_intelligence
    • First observedget_weekly_scorecard
    • First observedmcdonalds_locations
    • First observedrecommend_local_action
    • First observedsearch_brands
    • First observedsemantic_vector_search
    • First observedstarbucks_store_status
    • First observedtopup_credits
    • First observedtrack_brand_changes

TDQS

A4.1/5.0

Scored across 17 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides hospitality intelligence tools for restaurant optimization, including menu profitability analysis, food cost calculation, reservation management, review sentiment analysis, and allergen checking.
    1 npm
    54 PyPI
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Franchise 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.
    8
    4 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    The 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
    -