Brandfetch MCP Server
This MCP server gives AI agents Brandfetch brand data, context, comparison, and approved asset tools through shared CLI/MCP surfaces with isolated private accounts.
Retrieve current brand data by domain, email, URL, Brand ID, ticker, ISIN, or crypto symbol with explicit routing and cache-only option.
Search brands by name using a configured client ID.
Get interpreted brand context for domain, URL, or email (probabilistic, not verified facts).
Enrich a transaction descriptor with a country code without creating a payment.
Get viewer metadata to verify Brand API identity.
Prefetch a brand via confirmed HEAD request that may queue a provider crawl.
Fetch focused brand colors or fonts while keeping other data out of output.
Compare two to five brands sequentially in one private profile, preserving order and stopping on first failure.
Build browser-display Logo API URLs with optional type, dimensions, theme, fallback, and format.
Download up to five original private brand logo assets into an existing owner-private directory with confirmation.
List private account/profile labels and credential availability without exposing secrets.
Inspect pinned native operation schemas and locally preview native request shapes.
Use named profiles, read-only mode, cached-only misses, and confirmation guards for write operations.
Installs and runs the Brandfetch MCP server or CLI via npm packages.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Brandfetch MCP Serverget the brand colors and fonts for stripe.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Brandfetch MCP Server & CLI
Brandfetch MCP server and CLI for Codex and AI agents. Fourteen shared tools for current brand data, context, transaction enrichment, bounded comparison and approved private assets across isolated named profiles.
One package gives you a task CLI, local stdio MCP and versioned desktop bundle. Built and maintained by Navid Moazzez. Complete setup: navid.me.
The terminal illustrates shipped commands; it is not a recorded provider account session. Official hosted OAuth/rich cards and existing community CLIs are compared below. Live account outcomes, desktop GUI and matched Codex usage remain separately pending.
Two ways to use it
Command line
brandfetch-cli tools
brandfetch-cli get-brand-colors --identifier example.com --cachedOnly --agent
brandfetch-cli compare-brands --identifiers example.com --identifiers example.org --cachedOnly --agentMCP server, for your AI app
codex mcp add brandfetch --env BRANDFETCH_TOKEN_FILE=/absolute/private/brandfetch.txt -- npx -y @thenavidm/brandfetch-mcp-cli@latestWhich one
Where you work | Route |
Codex / Cursor / agents with shell | Task CLI, local MCP or both |
Claude Desktop | Versioned custom extension or manual stdio |
Scripts / CI | Same task CLI and profile/approval policies |
Remote-only clients / rich brand cards | Official hosted Brandfetch MCP |
Related MCP server: brand-gen
Features
Capability | CLI command | MCP tool |
Current brand data | get-brand | get_brand |
Focused colors/fonts | get-brand-colors / get-brand-fonts | get_brand_colors / get_brand_fonts |
Ordered two-to-five comparison | compare-brands | compare_brands |
Interpreted context / transaction | get-brand-context / enrich-transaction | get_brand_context / enrich_transaction |
Approved crawl / private files | prefetch-brand / download-brand-logos | prefetch_brand / download_brand_logos |
Browser logo URL | get-logo-url | get_logo_url |
Private profiles / native schemas | list-accounts / get-operation-schema | list_accounts / get_operation_schema |
Local native preview | preview-operation | preview_operation |
Contents
Number | Section | What it covers |
1 | What you can ask it | |
2 | Quick install | |
3 | Set up Brandfetch access | |
4 | Connect your client | |
5 | Check it works | |
6 | Output, flags and exit codes | |
7 | MCP or CLI and token cost | |
8 | Every tool and argument | |
9 | Brand, context and transaction workflows | |
10 | Bounded comparison and private downloads | |
11 | Several private accounts | |
12 | Writing safely | |
13 | How the two surfaces work | |
14 | Your data | |
15 | Environment variables | |
16 | Updates and removal | |
17 | Troubleshooting | |
18 | API coverage and comparisons | |
19 | Versions and migration | |
20 | FAQ |
1. What you can ask it
Find a brand by name with a configured search client ID.
Read brand data by domain, email, URL, Brand ID, ticker, ISIN or crypto symbol; choose explicit routes to avoid collisions.
Retrieve only colors or fonts and keep private asset credentials out of model output.
Compare two to five requested brands in the same private profile, stopping on failure.
Read interpreted brand context with the cache-only option when appropriate.
Enrich the specific transaction descriptor requested by the user, without creating a payment.
Queue one approved brand crawl, or download a bounded set of original assets into a private directory.
Actual shared discovery returns 14 tools: 12 reads/helpers and two confirmed operations, covering 11 current native Brand API V2 operations through consolidated tools. All seven legacy names remain, with explicit 2.0 changes documented below. This package adds a useful CLI/local workflow companion; official hosted OAuth and rich cards remain alternatives.
2. Quick install
npm install -g @thenavidm/brandfetch-mcp-cli@latest
brandfetch-cli --version
brandfetch-cli tools
brandfetch-cli schema get-brand
brandfetch-cli loginNode 22+ is required for manual installs. Discovery and local native previews work without credentials. Provider calls need the corresponding private Brand API key or separate client ID. The versioned desktop bundle includes production dependencies; see INSTALL.md for client/OS setup.
3. Set up Brandfetch access
Two separate provider credentials
Open the Brandfetch developer portal. Obtain a Brand API key for brand data, context, transaction enrichment, prefetch and viewer reads. Check the account's current plan and quota.
Obtain a separate Logo API client ID for Brand Search and browser-displayed Logo API URLs. It identifies the application and belongs in those browser URLs; it is not a Brand API Bearer key.
Store the Brand API key outside repositories in an absolute owner-only token-only file, or configure BRANDFETCH_API_KEY in private local settings. Configure BRANDFETCH_CLIENT_ID separately. Official MCP bf1 tokens and hosted OAuth sessions are different credentials; do not pass them as REST API keys.
Run brandfetch-cli doctor for local settings/presence. Deliberately run doctor --network to read the selected Brand API viewer; this verifies that request, not every feature or client. For a client-ID-only profile, test search instead of the Brand API viewer.
Read the exact requested brand. Choose cachedOnly=true when a cache miss should remain a 204 without crawling. Approve prefetch or a private download only when requested.
Brand API keys go only to the fixed api.brandfetch.io REST origin in Authorization: Bearer. Search uses native query c and sends no Bearer header. Named profiles never inherit global keys or client IDs. login prints setup instructions; it does not open a browser, store credentials, purchase access, refresh tokens or implement OAuth. This package does not load .env files or official MCP sessions automatically.
On macOS/Linux, use an existing owner-private directory (0700) and a regular non-symlink token-only file (0600) at an absolute path, at most 64 KiB. Token-file credentials override the profile environment key and are cached until restart. On Windows, restrict file/directory ACLs to your user; POSIX mode checks do not validate Windows ACL protection. GUI apps and remote development environments may not inherit the terminal environment.
Plans, quota and paid reads
The AGPL wrapper is free. Brandfetch access, brand/context/transaction credits and provider terms remain separate. Check current pricing and your dashboard before using the API. Indexed Brand API reads can consume quota. A read may crawl on a cache miss unless cachedOnly=true. Local colors/fonts filtering and CLI --select reduce output only, not provider calls, bytes or credits.
Brand Search and Logo API use their own client-ID contract. Current Logo API documentation describes one million monthly hotlink requests on the free tier, with soft limits and traffic ceilings; this does not make Brand API reads free. Account eligibility, quotas and limits can change. HTTP 402/429 indicate payment/quota/rate constraints; a 403 with an explicit quota/credit/limit detail maps to exit 7, while ordinary 401/403 map to authentication/permission exit 4. HEAD errors may contain no JSON detail; inspect provider settings and status rather than assuming the cause.
The default local 200 ms pacing is per profile/process across API and asset requests, not a provider-wide quota reservation. Other processes and profiles using the same key share upstream limits. No request automatically retries on a timeout, redirect, 429 or 5xx. JSON bodies are capped at 1 MiB; each API response and asset at 5 MiB. Asset requests have a maximum five-second timeout. Comparisons make two to five ordered reads; downloads make one brand read and up to five original asset GETs.
Logo hotlinks versus private assets
get_logo_url constructs browser-display URLs locally. The provider blocks programmatic fetching of Logo API client-ID hotlinks. Do not spoof browser headers or download these URLs with scripts. For local files, download_brand_logos uses only original credentialed src URLs returned by the Brand API, preserving their path and per-request credential. API keys are never forwarded to the CDN. Redirects, arbitrary hosts, hotlink routes and missing/duplicated c parameters refuse.
Brand API src credentials are redacted from model output, including ordinary get_brand results. This preserves asset metadata but deliberately changes the legacy behavior of returning all credentialed src strings. The official MCP provides interactive cards and a bounded image resource stream when those capabilities are needed. Downloaded SVGs/images remain untrusted files; this wrapper does not execute or automatically render them.
Rotate and revoke
Rotate or revoke the intended Brand API key in Brandfetch, update private settings/files and restart clients. Update the client ID separately if its application configuration changes. Uninstalling npm does not revoke access, undo a provider crawl or delete private downloaded assets. Keep private profiles, keys, viewer metadata and per-request URLs out of public issues, screenshots and logs.
4. Connect your client
codex mcp add brandfetch --env BRANDFETCH_TOKEN_FILE=/absolute/private/brandfetch.txt -- npx -y @thenavidm/brandfetch-mcp-cli@latest
codex mcp listCodex is the current primary agent. Forward BRANDFETCH_CLIENT_ID privately as well when using search or browser logo URLs. INSTALL.md includes TOML env_vars, Windows paths, Claude Desktop bundled/manual setup, optional Claude Code, Cursor, VS Code/Copilot, Windsurf, Zed, Gemini CLI, Cline and Docker. The same package exposes local stdio only; remote-only clients can use the official hosted MCP with its current OAuth/token setup. GUI installation is separate from downloaded archive protocol verification.
5. Check it works
brandfetch-cli doctor
brandfetch-cli doctor --network
brandfetch-cli list-accounts --agent
brandfetch-cli get-viewer --agent
brandfetch-cli get-brand --identifier example.com --cachedOnly --agentLocal doctor reports settings/presence and does not authenticate. Network doctor deliberately reads the selected Brand API viewer. A client-ID-only profile can search and construct browser URLs but cannot make Brand API reads. Cached misses are reported as status 204 / cachedMiss:true / data:null. Do not queue crawls or download assets merely to test installation. Read-only discovery returns 12 tools and refuses direct confirmed writes.
6. Output, flags and exit codes
MCP uses underscore names; CLI uses derived hyphen names from the same schemas and handlers. Both return native data unless a focused helper explicitly documents its wrapper. Per-request asset credentials and configured keys are removed before output.
Command or flag | Contract |
tools / no command | Real current tool list, writes marked |
COMMAND --help / schema COMMAND | Derived options / complete JSON Schema |
--agent | Compact JSON, no prompts/color; --yes never means mutation confirmation |
--select a,b.c | Local output selection; does not reduce provider reads/quota |
--account NAME | Exact private profile label |
--confirm | Approve the exact prefetch or private-download operation |
--cachedOnly | Native cache-only option; CLI retains provider camel case |
--identifier-type | auto/domain/ticker/isin/crypto for brand lookups |
--identifiers | Repeat for two to five ordered unique comparison identifiers |
--output-dir / --max-files | Existing private directory / one to five asset cap |
brandfetch-cli get-brand --identifier example.com --agent --select name,domain,colors
brandfetch-cli compare-brands --identifiers example.com --identifiers example.org --cachedOnly --agentExit | Meaning |
0 | Success, including an explicitly reported cache miss |
2 | Invalid arguments or refused operation |
3 | Provider not found |
4 | Authentication/permission failure |
5 | Provider, transport, content or file-persistence failure |
7 | Rate limit or explicit quota exhaustion |
10 | Missing/invalid private configuration |
Partial comparisons/download failures return errors and retain completed results/file paths inside the diagnostic. No automatic rollback or retry is performed. Native cachedOnly=true affects provider resolution; colors/fonts/--select affect only local output.
7. MCP or CLI and token cost
Route | What reaches the agent | What is proven |
Local MCP | Client-dependent names, schemas/instructions and requested results | Real shared discovery and fixture protocol behavior |
Shared CLI | Available skill/help and selected output | Same handlers, profiles, validation and guards |
Official MCP | Hosted OAuth, rich cards/resources and provider tools | Current docs/source inspected; hosted task not benchmarked |
Focused colors/fonts/comparison | Requested fields with explicit bounds | Output filtering and request caps, not measured token savings |
No fresh matched Codex measurements are published. Measure actual API usage, identical successful tasks/resources/permissions, client/model/package versions and date. Schema characters divided by four, another repo's numbers or counts do not establish efficiency. MCP schema loading depends on the client. Neither surface requires Claude Code; its measurements are deferred at Navid's instruction.
8. Every tool and argument
All tools/arguments below come from actual shared discovery. Confirmation is enforced before handler execution, beyond ordinary required-key validation. Unknown declared arguments refuse. Bounds are explicit local limits, not provider entitlement guarantees.
MCP tool | CLI command | Policy |
|
| Read / local helper |
|
| Read / local helper |
|
| Read / local helper |
|
| Read / local helper |
|
| Read / local helper |
|
| Explicit confirmation |
|
| Read / local helper |
|
| Read / local helper |
|
| Read / local helper |
|
| Read / local helper |
|
| Explicit confirmation |
|
| Read / local helper |
|
| Read / local helper |
|
| Read / local helper |
get_brand
brandfetch-cli get-brand
Current Brand API V2 data through generic or explicit routes. One request; credentialed asset src URLs are redacted from output. Provider reads may spend quota or crawl on a miss.
Argument | Required | Type | Details |
| Yes | string | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. minLength: |
| No; body and guard rules apply | string | Explicit provider route avoids identifier collisions. Values: |
| No; body and guard rules apply | boolean | Optional provider NSFW behavior; absence differs from false. |
| No; body and guard rules apply | boolean | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. default: |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
search_brands
brandfetch-cli search-brands
Search by name with the selected profile client ID in native query c. No Brand API Bearer key sent. One request; no pagination or retries.
Argument | Required | Type | Details |
| Yes | string | Brand name to search. minLength: |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
get_brand_context
brandfetch-cli get-brand-context
One Brand Context API request. Context is probabilistic interpretation, not verified company facts. Accepts domain/email/URL; cachedOnly avoids crawling a miss.
Argument | Required | Type | Details |
| Yes | string | Domain, URL or email address. minLength: |
| No; body and guard rules apply | boolean | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. default: |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
enrich_transaction
brandfetch-cli enrich-transaction
Resolve the user-requested transaction label into brand data. Sends the label and country to Brandfetch and may consume credits; does not create a charge, bank connection or payment.
Argument | Required | Type | Details |
| Yes | string | Only the specific transaction label requested by the user. minLength: |
| Yes | string | ISO 3166-1 alpha-2 country code, uppercase. pattern: |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
get_viewer
brandfetch-cli get-viewer
GET /v2/viewer using the selected private Brand API key. Returns provider viewer metadata; does not purchase access or expose the key.
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
prefetch_brand
brandfetch-cli prefetch-brand
Explicitly confirmed HEAD request can enqueue a provider crawl. Generic or domain route only. Return 200 indexed / 202 crawl queued; never poll, purchase or resubmit automatically.
Argument | Required | Type | Details |
| Yes | string | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. minLength: |
| No; body and guard rules apply | string | See the full input schema. Values: |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
| No; body and guard rules apply | boolean | Must be true for this exact provider crawl request. |
get_brand_colors
brandfetch-cli get-brand-colors
One native brand read with only name, domain and colors returned. Filtering is local: provider quota and crawling behavior are unchanged.
Argument | Required | Type | Details |
| Yes | string | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. minLength: |
| No; body and guard rules apply | string | Explicit provider route avoids identifier collisions. Values: |
| No; body and guard rules apply | boolean | Optional provider NSFW behavior; absence differs from false. |
| No; body and guard rules apply | boolean | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. default: |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
get_brand_fonts
brandfetch-cli get-brand-fonts
One native brand read with only name, domain and fonts returned. Filtering is local: provider quota and crawling behavior are unchanged.
Argument | Required | Type | Details |
| Yes | string | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. minLength: |
| No; body and guard rules apply | string | Explicit provider route avoids identifier collisions. Values: |
| No; body and guard rules apply | boolean | Optional provider NSFW behavior; absence differs from false. |
| No; body and guard rules apply | boolean | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. default: |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
compare_brands
brandfetch-cli compare-brands
Read two to five unique identifiers sequentially in one exact profile, preserving input order. Return colors/fonts/logo counts; stop at the first failure with completed results. No retries, cross-account mixing or complete-market claim.
Argument | Required | Type | Details |
| Yes | array | Two to five distinct identifiers in requested order. minItems: |
| No; body and guard rules apply | string | Explicit provider route avoids identifier collisions. Values: |
| No; body and guard rules apply | boolean | Optional provider NSFW behavior; absence differs from false. |
| No; body and guard rules apply | boolean | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. default: |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
get_logo_url
brandfetch-cli get-logo-url
Local Logo API URL construction with the selected profile client ID. Direct browser display only; programmatic fetching these hotlinks is prohibited/blocked. No provider call or automatic download.
Argument | Required | Type | Details |
| Yes | string | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. minLength: |
| No; body and guard rules apply | string | See the full input schema. Values: |
| No; body and guard rules apply | string | Explicit asset type; separate from identifier_type. Values: |
| No; body and guard rules apply | boolean | Legacy compatibility: true selects icon. Do not combine with type. |
| No; body and guard rules apply | integer | See the full input schema. minimum: |
| No; body and guard rules apply | integer | See the full input schema. minimum: |
| No; body and guard rules apply | string | See the full input schema. Values: |
| No; body and guard rules apply | string | See the full input schema. Values: |
| No; body and guard rules apply | string | SVG allowed only for logo or symbol. Values: |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
download_brand_logos
brandfetch-cli download-brand-logos
Confirmed one brand lookup plus at most five original credentialed Brand API logo src downloads. Owner-private directory and exclusive files only; cap 5 MiB each, fixed CDN, no redirects/Bearer forwarding/hotlink evasion/retries. Stop on failure, retain and report completed/reserved files.
Argument | Required | Type | Details |
| Yes | string | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. minLength: |
| No; body and guard rules apply | string | Explicit provider route avoids identifier collisions. Values: |
| No; body and guard rules apply | boolean | Optional provider NSFW behavior; absence differs from false. |
| No; body and guard rules apply | boolean | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. default: |
| No; body and guard rules apply | string | Exact private profile label. Never inherits another profile or global key/client ID. |
| Yes | string | Existing canonical absolute owner-private directory. minLength: |
| No; body and guard rules apply | string | See the full input schema. Values: |
| No; body and guard rules apply | integer | See the full input schema. minimum: |
| No; body and guard rules apply | boolean | Approve exactly this provider lookup and bounded private local downloads. |
list_accounts
brandfetch-cli list-accounts
Local labels, default and credential method availability only. No keys, client IDs, private paths or network.
Argument | Required | Type | Details |
None | No | None | No arguments |
get_operation_schema
brandfetch-cli get-operation-schema
Complete pinned Brandfetch path/query/body schema and documented response statuses for one of 11 supported native operations. Local only; agent purchases excluded.
Argument | Required | Type | Details |
| Yes | string | See the full input schema. Values: |
preview_operation
brandfetch-cli preview-operation
Validate one exact native operation request locally, without loading keys/client IDs, contacting Brandfetch, reserving files or claiming provider validation or price. Search c is added from private profile at execution.
Argument | Required | Type | Details |
| Yes | string | See the full input schema. Values: |
| Yes | object | Native path/query arguments and transaction payload. Inspect get_operation_schema first. |
Complete native operations and request shapes
get_brand consolidates six GET routes through identifier_type; prefetch_brand consolidates two HEAD routes. get_operation_schema returns these exact native parameter/body facts. preview_operation uses native parameter names: search name; transaction payload.transactionLabel and payload.countryCode. Execution tools use their documented friendly flags. Search c is supplied from the private selected profile.
getBrandData
GET /v2/brands/{identifier}. Documented statuses: 200, 204, 400, 401, 402, 404, 429.
Argument | Required | Type | Details |
| Yes | string | Native path parameter. minLength: |
| No; body and guard rules apply | boolean | Native query parameter. |
| No; body and guard rules apply | boolean | Native query parameter. default: |
prefetchBrand
HEAD /v2/brands/{identifier}. Documented statuses: 200, 202, 400, 401, 403, 404, 429, 503.
Argument | Required | Type | Details |
| Yes | string | Native path parameter. minLength: |
getBrandDataByDomain
GET /v2/brands/domain/{domain}. Documented statuses: 200, 204, 400, 401, 402, 404, 429.
Argument | Required | Type | Details |
| Yes | string | Native path parameter. minLength: |
| No; body and guard rules apply | boolean | Native query parameter. |
| No; body and guard rules apply | boolean | Native query parameter. default: |
prefetchBrandByDomain
HEAD /v2/brands/domain/{domain}. Documented statuses: 200, 202, 400, 401, 403, 404, 429, 503.
Argument | Required | Type | Details |
| Yes | string | Native path parameter. minLength: |
getBrandDataByTicker
GET /v2/brands/ticker/{ticker}. Documented statuses: 200, 204, 400, 401, 402, 404, 429.
Argument | Required | Type | Details |
| Yes | string | Native path parameter. minLength: |
| No; body and guard rules apply | boolean | Native query parameter. |
| No; body and guard rules apply | boolean | Native query parameter. default: |
getBrandDataByIsin
GET /v2/brands/isin/{isin}. Documented statuses: 200, 204, 400, 401, 402, 404, 429.
Argument | Required | Type | Details |
| Yes | string | Native path parameter. minLength: |
| No; body and guard rules apply | boolean | Native query parameter. |
| No; body and guard rules apply | boolean | Native query parameter. default: |
getBrandDataByCrypto
GET /v2/brands/crypto/{symbol}. Documented statuses: 200, 204, 400, 401, 402, 404, 429.
Argument | Required | Type | Details |
| Yes | string | Native path parameter. minLength: |
| No; body and guard rules apply | boolean | Native query parameter. |
| No; body and guard rules apply | boolean | Native query parameter. default: |
searchBrands
GET /v2/search/{name}. Documented statuses: 429, 503, 200.
Argument | Required | Type | Details |
| Yes | string | Native path parameter. minLength: |
| Yes | string | Native query parameter. minLength: |
getBrandContext
GET /v2/context/{domain}. Documented statuses: 200, 204, 400, 401, 402, 404, 429.
Argument | Required | Type | Details |
| Yes | string | Native path parameter. minLength: |
| No; body and guard rules apply | boolean | Native query parameter. default: |
getBrandFromTransaction
POST /v2/brands/transaction. Documented statuses: 200, 400, 401, 402, 404, 429, 503.
Argument | Required | Type | Details |
None | No | None | No arguments |
Native transaction JSON body:
Argument | Required | Type | Details |
| Yes | string | See the full input schema. minLength: |
| Yes | string | See the full input schema. pattern: |
getViewer
GET /v2/viewer. Documented statuses: 200, 401, 403.
Argument | Required | Type | Details |
None | No | None | No arguments |
9. Brand, context and transaction workflows
Resolve the requested identifier
Search returns candidate brands; select the intended domain before fetching. Generic lookup accepts domains, email addresses, URLs, Brand IDs, tickers, ISINs and crypto symbols. Provider resolution order is domain → ticker → ISIN → crypto; explicit identifier_type routes avoid ambiguity. Email/URL lookup resolves a registrable domain and does not establish that the domain is the person's employer. Explicit domain routes reject email/URL inputs locally.
brandfetch-cli search-brands --query Example --agent
brandfetch-cli get-brand --identifier example.com --identifier-type domain --cachedOnly --agent
brandfetch-cli get-brand-colors --identifier example.com --cachedOnly --agent
brandfetch-cli get-brand-fonts --identifier example.com --cachedOnly --agent
brandfetch-cli get-brand --identifier BTC --identifier-type crypto --agentContext and enrichment
Brand Context returns interpreted positioning, voice and related information. Treat it as probabilistic interpretation requiring review. Use only the transaction descriptor requested by the user; it is sent to Brandfetch. This is a brand resolution API, not a payment or bank account workflow.
brandfetch-cli get-brand-context --domain example.com --cachedOnly --agent
brandfetch-cli enrich-transaction --transaction-label "EXAMPLE CAFE" --country-code US --agentExplicit prefetch
prefetch_brand requires confirmation because HEAD can queue crawling. A 200 reports indexed and 202 reports crawlQueued; it does not guarantee a future lookup result, initiate polling or prove completion. There is no automatic payment, fallback purchase or wallet support.
brandfetch-cli prefetch-brand --identifier example.com --confirm --agent10. Bounded comparison and private downloads
Ordered comparison
compare_brands accepts two to five unique identifiers, prevalidates all of them before the first request, then reads sequentially in one exact selected profile. It returns name/domain/colors/fonts/logo counts and qualityScore, preserving input order. A 204 remains an explicit cache miss. A failure stops subsequent requests and reports completed results plus the failed/remaining identifiers. Earlier reads may have consumed quota. There is no persistent result cache, completeness claim or automatic continuation.
brandfetch-cli compare-brands --identifiers example.com --identifiers example.org --account work --cachedOnly --agentApproved private files
Create an owner-private directory yourself before requesting a download. output_dir must be absolute, canonical and already present. Symlink directories and public POSIX permissions refuse before the brand lookup; Windows owners must restrict ACLs. No automatic directory creation or hidden default output directory is used.
mkdir -m 700 /absolute/private/brand-assets
brandfetch-cli download-brand-logos --identifier example.com --output-dir /absolute/private/brand-assets --format-preference svg --max-files 2 --confirm --agentThe helper performs one brand read, selects matching logo formats in provider order and downloads at most max_files (default three, maximum five). format_preference supports svg/png/all; all allows documented SVG, PNG, JPEG, WebP and GIF asset formats. Selection is bounded, not all-assets export. Each original credentialed CDN URL is validated before the first file download. Fixed allowed HTTPS CDN only; no redirects, key forwarding, browser-header spoofing or hotlink downloads. Each response is streamed under a 5 MiB cap and image Content-Type must match the selected declared format.
Files use random exclusive names and 0600 creation; existing files are never overwritten. SHA-256, actual bytes, format and local path are returned; credential URLs are not written to a manifest or model output. A failure stops subsequent downloads and reports completed files plus any reserved path; the reserved file may be empty or incomplete. Inspect it privately rather than retrying blindly. No rollback deletes earlier completed files, and nothing executes or previews downloaded SVGs.
Browser-only logo URLs
get_logo_url keeps identifier_type separate from asset type, fixing the legacy icon flag that discarded ticker/ISIN/crypto routing. The legacy icon flag remains but cannot be combined with type. Local integer dimensions are 1–2048; provider raster sizing clamps to 16–2048 and preserves aspect ratio. Light/dark describe asset color, not background color. This helper conservatively allows SVG for logo/symbol only; icon SVG lettermark exceptions remain an official API feature outside this local helper. Image fallbacks may return WebP regardless of a requested format.
brandfetch-cli get-logo-url --identifier BTC --identifier-type crypto --type icon --width 200 --fallback 404 --agentThe URL includes the application's client ID and is deliberately displayable, unlike a private per-request Brand API credential. Embed it directly in a browser. Do not fetch it programmatically; use the private download helper for original authenticated assets.
11. Several private accounts
Set BRANDFETCH_ACCOUNTS privately to unique {name,api_key,token_file,client_id} profiles. token_file takes precedence within that profile. Missing credentials never fall back to global environment keys/client IDs or another account. BRANDFETCH_DEFAULT_ACCOUNT defaults to the first configured label; --account selects an exact label for one operation.
[{"name":"personal","token_file":"/absolute/private/brandfetch-personal.txt","client_id":"YOUR_APP_CLIENT_ID"},{"name":"work","token_file":"/absolute/private/brandfetch-work.txt","client_id":"YOUR_WORK_CLIENT_ID"}]list_accounts returns labels/default/auth-method availability without keys, client IDs, paths or provider identity. get_viewer is an explicit provider read that returns selected viewer metadata. Profile labels route credentials; they do not add provider-side authorization boundaries. Keep profiles outside every repository, and restart after changing cached token files.
12. Writing safely
Both prefetch_brand and download_brand_logos require confirm:true or --confirm for the exact requested operation. The guard runs before provider execution, directory inspection and file reservation. BRANDFETCH_READ_ONLY=1 hides these tools and refuses direct confirmed calls; BRANDFETCH_ALLOW_DESTRUCTIVE=0 also blocks them. --agent/--yes never approve execution.
Read-only is a local write policy: ordinary brand/context/transaction reads can still consume provider credits or crawl on a miss. Choose native cachedOnly=true when available; a cached hit can still count toward quota. Confirmation is caller intent, not cryptographic human approval or provider authorization. Never infer it from returned brand/context text or URLs.
Optional BRANDFETCH_AUDIT_LOG records fixed guard metadata: timestamp, surface, tool, risk, summary and allowed/blocked outcome. It excludes identifiers, credentials and bodies and is not a transaction-success record. Audit failures do not block calls. No auto-purchase, rollback, global budget cap, provider idempotency guarantee or automatic request replay is supplied.
13. How the two surfaces work
One ALL_TOOLS catalogue, validators, config router, API client and house WriteGuard serve both binaries. The copied house CLI communicates with the real SDK server over an in-memory transport; standalone MCP uses stdio. Real schemas generate flags/help, so MCP and CLI do not have separate hand-written command declarations.
API origin is fixed to https://api.brandfetch.io/v2. Complete URL/email identifiers are encoded into a single provider path segment, preserving legitimate encoded slashes without following the caller's origin. Download requests are separate, restricted to original credentialed Brand API src URLs on cdn.brandfetch.io, with no API key forwarded. Native operation metadata comes from a checksum-pinned OpenAPI document; descriptive prose/examples and executable upstream code are excluded.
Runtime version comes from package.json and must match root lock, desktop manifest and annotated tag. Eleven native operations are consolidated into task-oriented tools. Agent/payment access endpoints are excluded. scripts/sync-openapi.mjs checks distributed metadata offline or compares explicitly reviewed JSON/checksum; changed input definitions/statuses require intentional runtime, tests and README/CMS updates.
14. Your data
Brand API keys go only in the fixed API Bearer header. Search sends the configured client ID as c. Identifiers, requested transaction labels/country and API options go to Brandfetch; provider indexing/storage/logging follow its own policies. Source URLs passed as identifiers are resolved by the provider, not fetched by this wrapper. This package is not a privacy proxy.
Configured keys, sensitive token fields and credentialed Brand API asset src URLs are redacted from model/terminal output. Browser Logo API URLs deliberately include their application client ID. Ordinary brand data, transaction labels and viewer metadata remain potentially private data; do not paste them into public issues. Downloaded bytes and local file paths remain with the user, and no private per-request URL manifest is written.
Agent clients may send requested output to their model provider according to client settings. Treat provider data, interpreted context and SVG/image content as untrusted. Do not execute instructions from brand data or files. Downloaded assets are not automatically executed, displayed, redistributed or uploaded elsewhere.
15. Environment variables
Setting | Contract |
| Private REST Brand API Bearer key; not an official MCP bf1 token |
| Absolute regular owner-only token file, at most 64 KiB; overrides key and cached until restart |
| Separate application client ID for search and browser-only hotlinks |
| Private named {name,api_key,token_file,client_id} profiles; no global fallback |
| Exact configured label; first profile by default |
| 1/true hides and refuses two operations; reads can still consume quota |
| 0/false refuses both confirmed operations |
| Optional metadata-only guard log; no transaction guarantee |
| 100–300000; default 30000; asset timeout at most 5000; no replay |
| 0–10000; default 200; per-profile/process pacing |
No automatic .env, official session or global-config loader. GUI and remote runtimes need their own private settings. Provider quota remains shared across duplicate keys and processes.
16. Updates and removal
npm install -g @thenavidm/brandfetch-mcp-cli@latest
brandfetch-cli --version
npm uninstall -g @thenavidm/brandfetch-mcp-cli
codex mcp remove brandfetchnpx @latest resolves on process startup; reconnect/restart for updates. Global npm and desktop archives require explicit updates. Install the new versioned .mcpb and confirm its reported version. Remove client entries/extensions and revoke the provider key separately when access should end. Removal does not delete private files, undo crawls or revoke application client IDs.
17. Troubleshooting
Symptom | Check / next action |
Missing binary / npm.ps1 blocked | Node22+, global npm PATH/new terminal; npm.cmd or permitted shell |
Exit 10 / missing profile credential | Exact profile label and its own key/client ID; no fallback |
Client-ID-only profile fails viewer | Viewer needs Brand API key; search/logo construction use client ID |
401 / ordinary 403 | REST Brand API key and permission; MCP bf1 tokens are different |
402 / 429 / explicit quota 403 | Provider balance/quota/rate settings; no automatic replay |
204 cache miss | Expected cachedOnly miss, not malformed JSON or successful brand result |
HEAD 202 | Crawl queued, not complete; later deliberate read required |
Explicit domain rejects URL/email | Use generic identifier_type=auto for those formats |
Brand/context 404 | Intended identifier, provider availability and optional NSFW policy |
Logo hotlink blocked | Browser display only; private download uses Brand API src credentials |
Private directory refused | Existing canonical absolute owner-private directory; Windows owner ACL |
Download reserved/partial file | Inspect reported paths; no overwrite, rollback or automatic replay |
Asset MIME/size/redirect error | Original allowed-CDN src only, supported image MIME and 5 MiB cap |
Private src missing from get_brand | Deliberate credential redaction; use approved download helper |
Schema/source check reports change | Review provider docs, local bounds and every input table before updating |
Desktop installation rejected | Actual host/runtime/extension policy; artifact and GUI checks differ |
Share sanitized status, operation and package/Node/client versions. Omit keys, profiles, private identifiers, descriptors, viewer metadata, credential URLs and files.
18. API coverage and comparisons
Offering | Reviewed surface | Strengths and limits |
Hosted OAuth / MCP bf1 tokens and official Python server source | Seven documented/current source tools: brand_search, get_brand, get_brand_data, get_brand_context, enrich_transaction, build_logo_urls and send_feedback. Provider maintained, interactive MCP Apps brand cards and bounded bf://asset streaming. No official runtime/tool discovery or hosted account login is claimed here. | |
pyproject version 1.5.0, commit 0995f0f39a43206d9082945d8b424c449dc6147d | Python >=3.11,<3.12; HTTP deployment and per-request credential context. Its source already caps image streaming, checks allowed CDN hosts and distinguishes browser hotlinks from authenticated asset sources. These are not invented missing safeguards. | |
@sourcescape/external 0.1.2; external / stc-ext | Actual published Brandfetch service source includes brand, search and svg purpose commands. Injected brand/search fixtures use global environment key/client ID and return full data. They have no named account argument, timeout signal or redirect policy in those handlers. Other generic service/router capabilities are not claimed absent. | |
PyPI brandfetch 0.4.0 metadata/README | Browser scraping and WHOIS CLI plus lookup_brand/search_brands/whois_lookup MCP tools. Different data and runtime approach; not an official REST SDK. No installation/provider benchmark is claimed. | |
brandfetch-mcp-server 1.0.0 published source | MCP binary alternative. Inspected package declares no standalone task CLI. No live provider behavior or complete equivalence is claimed. | |
This owned integration | Shared task CLI, local stdio MCP, versioned desktop bundle | Fourteen shared tools, twelve reads/helpers and two mandatory-confirmation operations. Isolated named profiles, bounded ordered comparison, local output selection and approved exclusive private asset files. No hosted OAuth, MCP Apps card, feedback telemetry or automatic payment. |
Checked October 3, 2026. The actual Sourcescape published brand/search handlers ran with injected fetch and fixture-only credentials; no provider account was contacted. Their full fixture brand output retained a per-request credentialed asset src. Our equivalent fixture excludes that credential from output, routes named accounts without global fallback, derives CLI options from the same MCP schema and supports bounded comparison/private downloads. This demonstrates useful local workflow and output-policy differences, not overall product superiority.
The official MCP is a strong alternative when provider-managed OAuth, rich brand cards, resource streaming or feedback are the desired workflow. Its built_logo_urls supports multiple identifiers already. Our useful recurring task is scriptable brand/context/transaction retrieval and comparison across isolated accounts, followed by explicitly requested private file delivery. The shared MCP also makes those exact bounded local workflows available to stdio clients. More tool names and SEO alone do not justify this build.
The published OpenAPI search path embeds ?c={clientId}; this package routes c as a query parameter from the selected profile. The agent overview describes keyless search while the endpoint reference requires c; the package follows the endpoint's explicit client-ID contract and fails locally when it is missing. We have not tested credential-free provider search. Agent access/payment endpoints are deliberately excluded: no wallet, card, auto-purchase or credential rotation.
No matched successful Codex task/token measurements, live provider outcomes or desktop GUI installation are claimed. Source/fixture evidence is recorded separately from public artifact and CMS release checks. Official and community versions should be rechecked for every update.
19. Versions and migration
Component | Reviewed version / source |
Owned wrapper / manifest | 2.0.0 |
Brandfetch native API | V2 routes; OpenAPI info version 1.0.0 |
OpenAPI snapshot | SHA-256 301955555b54cfdad90fcb655e70e7a8b5f6c53bf11362001b8d0b0de8d85bf0, October3 2026 |
Official server source | pyproject 1.5.0 / 0995f0f39a43206d9082945d8b424c449dc6147d |
Sourcescape external CLI | 0.1.2 published archive and injected handler fixtures |
Community PyPI brandfetch | 0.4.0 metadata/README; not installed |
Community npm MCP | brandfetch-mcp-server 1.0.0 inspected archive |
@modelcontextprotocol/sdk | 1.32.0 |
ajv | 8.20.0 |
ajv-formats | 3.0.1 |
typescript | 7.0.2 |
vitest | 5.0.3 |
vite | 8.3.2 |
@anthropic-ai/mcpb | 2.1.2 |
Private legacy 1.0.0 declares seven MCP tools and no standalone task CLI. Private history remains separate; no earlier owned public npm/tag release is assumed. All seven names survive, but 2.0 intentionally changes unsafe/obsolete behavior:
Legacy tool | 2.0 behavior |
search_brands | Same query name; uses selected profile client ID in native c, no global Bearer assumption |
get_brand | Same identifier/type names; current native data plus cachedOnly/allowNsfw, private asset src redaction |
get_brand_colors / get_brand_fonts | Focused return with native routing/options; same provider quota as a brand read |
get_logo_url | Separates identifier route from asset type; legacy icon accepted exclusively; browser-only display |
download_brand_logos | Mandatory confirmation, explicit existing private output_dir, bounded exclusive files; no implicit home directory or overwrite |
compare_brands | Same identifiers; sequential bounded profile workflow, stops/reports failure rather than silent parallel partial success |
BRANDFETCH_OUTPUT_DIR is retired; supply output_dir explicitly. CLI spelling uses hyphens while MCP names remain underscores. No automatic credential migration, payment or key rotation. Preserve and inspect old local outputs privately.
For maintenance, recheck official MCP/CLI alternatives and the native docs, review a fresh OpenAPI checksum, run source-input comparison and matched fixtures, regenerate runtime/docs/CMS input tables, align root/lock/manifest/tag, scan public source/artifacts, run platform CI and verify actual anonymous install/desktop/read-only/client/CMS rendering. Never execute downloaded vendor code as a schema updater or infer provider success from a metadata hash.
20. FAQ
Fourteen shared CLI/local MCP tools, twelve reads/helpers and two confirmed operations covering eleven current native V2 operations. It includes a versioned desktop bundle.
Yes. It provides hosted OAuth/MCP tokens, brand data/context/search/enrichment, rich MCP Apps cards and bounded asset resources. The current source is compared explicitly.
For a shared task CLI and bounded local workflows with isolated private profiles, selective output and approved exclusive local assets. Official hosted/card strengths remain useful.
Yes. Sourcescape external 0.1.2 has published Brandfetch commands; PyPI brandfetch 0.4.0 uses browser scraping/WHOIS. We do not claim CLI support is unique.
Use the private stdio configuration or the CLI/SKILL route in INSTALL.md. Fresh matched successful task/token measurements remain pending.
The versioned .mcpb bundles production dependencies. Actual archive protocol checks and GUI installation are tracked separately.
Manual Node22+ paths target macOS, Windows and Linux. CI checks all three on Node22/24. Windows private-file ACL protection must be configured by the owner.
Brand API reads need a private REST API key. Search and browser logo construction need a separate application client ID. Official MCP bf1 tokens are not interchangeable.
No. It prints private setup instructions and does not store keys, refresh sessions, purchase access or use a wallet.
No. Every selected profile uses only its own key/file/client ID. Missing credentials fail locally rather than falling back.
No. It hides/refuses prefetch and local downloads, while ordinary brand/context/transaction reads can still use quota or crawl. cachedOnly controls supported cache misses.
The brand/context was not cached. The wrapper returns status204, cachedMiss:true and data:null without treating it as malformed JSON.
No. A confirmed HEAD can return202 queued or200 indexed. It never waits, polls or retries automatically.
No. Client-ID hotlinks are intended for direct browser display and programmatic fetching is blocked. Private downloads use original Brand API asset src URLs.
They remain inside the request client, are redacted from get_brand/model output and are used only for approved CDN requests. No credential URL manifest is saved.
No. It requires an existing owner-private directory and creates random files exclusively. Failure reports completed and reserved paths without deleting earlier results.
No. It reads two to five unique identifiers in order and stops on the first failure, reporting completed and remaining work.
No. Brand Context is probabilistic interpretation. Review it; email/URL resolution also does not prove a person’s employer.
No fresh matched Codex measurements are available. Local output selection is proven, but counts or character estimates do not prove token savings.
Restart npx @latest, update global npm or install the new desktop bundle. Remove client entries and revoke provider credentials separately; private downloaded files remain.
Questions
Open a sanitized issue. Use SECURITY.md for private reports.
About the author
Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. This Brandfetch MCP server and CLI is one piece of that system.
Links
Personal website: navid.me
Link in bio: navid.bio
Navid Media: navid.media
YouTube: @thenavidm and @thenavidai
X: @thenavidm
Instagram: @thenavidm
LinkedIn: thenavidm
If this is useful, star the repo and come say hi on X.
Dependencies
Runtime: MCP TypeScript SDK, Ajv and ajv-formats. Development: TypeScript, Vitest, Vite and MCPB. Exact locked versions appear above. Packaging tools are excluded from desktop runtime.
License
Preserves AGPL-3.0-or-later and existing private legacy history. Read THIRD_PARTY_NOTICES.md. Brandfetch service terms and trademarks remain separate.
© 2026 Navid Media. Made with ❤️ by Navid Moazzez.
Available Tools
14 toolscompare_brandsCompare brandsARead-onlyIdempotent
Read two to five unique identifiers sequentially in one exact profile, preserving input order. Return colors/fonts/logo counts; stop at the first failure with completed results. No retries, cross-account mixing or complete-market claim.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. | |
| allowNsfw | No | Optional provider NSFW behavior; absence differs from false. | |
| cachedOnly | No | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. | |
| identifiers | Yes | Two to five distinct identifiers in requested order. | |
| identifier_type | No | Explicit provider route avoids identifier collisions. | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), yet the description adds genuine behavior beyond them: sequential execution, input-order preservation, early termination on first failure with partial results retained, and no retries. That partial-result semantics is exactly what an agent needs before deciding to call this in a pipeline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the cardinality and profile scope, then the return shape, then the failure/negative constraints. No filler, though the telegraphic phrasing ('one exact profile', 'complete-market claim') costs a little clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description steps in and names the returned data (colors/fonts/logo counts) and the partial-result behavior on failure. A 5-param, enum-bearing tool would ideally mention the identifier_type routing trade-off, but the schema's own descriptions cover that adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds order-preservation semantics ('preserving input order') and the 'one exact profile' constraint that the schema's account field only partially conveys. The distinctness of identifiers is restated rather than expanded, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (read two to five unique identifiers), the resource (brand identifiers), and the output surface (colors/fonts/logo counts), which is clearly more than the tautological title 'Compare brands'. The 2-5 cardinality implicitly separates it from the single-brand siblings like get_brand, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence gives real when-not guidance ('no cross-account mixing or complete-market claim'), and 'stop at the first failure' tells the agent this is a bounded batch read. However, it never routes the agent to a named alternative such as get_brand for a single lookup or search_brands for market-wide work, so the selection guidance stays implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_brand_logosDownload private brand logosADestructive
Confirmed one brand lookup plus at most five original credentialed Brand API logo src downloads. Owner-private directory and exclusive files only; cap 5 MiB each, fixed CDN, no redirects/Bearer forwarding/hotlink evasion/retries. Stop on failure, retain and report completed/reserved files.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. | |
| confirm | No | Approve exactly this provider lookup and bounded private local downloads. | |
| allowNsfw | No | Optional provider NSFW behavior; absence differs from false. | |
| max_files | No | ||
| cachedOnly | No | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. | |
| identifier | Yes | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. | |
| output_dir | Yes | Existing canonical absolute owner-private directory. | |
| identifier_type | No | Explicit provider route avoids identifier collisions. | auto |
| format_preference | No | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations covering the safety profile (readOnlyHint=false, destructiveHint=true, openWorldHint=true), the description goes well beyond them: fixed CDN, no redirects, no Bearer forwarding, no hotlink evasion, no retries, a 5 MiB per-file cap, stop-on-failure semantics, and retention/reporting of completed versus reserved files. That is rich operational context an agent could not derive from the structured fields, and nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the core action and scope, and every clause carries distinct information (caps, security constraints, failure handling). The phrasing is jargon-heavy and occasionally awkward ('original credentialed Brand API logo src downloads'), which slightly hurts scannability but not economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, file-writing, open-world tool with no output schema, the description covers the essentials: prerequisite confirmation, per-download caps, network/auth constraints, and partial-failure behavior with reporting. It stops short of clarifying quota consumption or the directory-prerequisite detail, but the picture is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 78%, close to the high-coverage band, so the schema already documents most parameters (identifier formats, cachedOnly quota note, account isolation). The description adds the 'at most five' cap and the confirm requirement, but does not touch allowNsfw, identifier_type, or format_preference, so it neither compensates nor detracts. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('download'), and pins down the scope precisely: one brand lookup plus up to five credentialed Brand API logo downloads into a local directory. It is clearly a write-to-disk operation, distinguishable from read-style siblings, though it never names an alternative such as get_logo_url for the URL-only case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'Confirmed one brand lookup' signals that the confirm parameter must be set, and the file-download framing suggests local writes rather than the URL-only path. There is no explicit 'use this instead of get_logo_url' routing or stated prerequisite (e.g. that output_dir must pre-exist), so the agent must infer when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enrich_transactionEnrich a transaction descriptorARead-onlyIdempotent
Resolve the user-requested transaction label into brand data. Sends the label and country to Brandfetch and may consume credits; does not create a charge, bank connection or payment.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. | |
| country_code | Yes | ISO 3166-1 alpha-2 country code, uppercase. | |
| transaction_label | Yes | Only the specific transaction label requested by the user. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, but the description adds real value beyond them: it makes an outbound third-party call to Brandfetch, may consume credits, and explicitly denies charge/bank-connection/payment side effects. That is useful behavioral context for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler. The core action comes first, followed by cost/side-effect information, so the most decision-relevant content is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema and full schema coverage, the description covers the action, the external call, credit cost, and the absence of financial side effects. It could briefly indicate the shape of returned brand data, but nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already documented and the baseline is 3. The description only adds that the label and country are forwarded to Brandfetch; it says nothing extra about the account parameter or the country-code format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (resolve/enrich) and resource (transaction label -> brand data), and clarifies it is not a payment or bank operation. It does not explicitly differentiate itself from the many sibling brand tools (get_brand, search_brands, prefetch_brand), so an agent must infer which to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'user-requested transaction label' implies the trigger condition, and 'may consume credits' warns of cost. However, it never names alternatives such as get_brand or search_brands, nor says when not to use this tool, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_brandGet brand dataBRead-onlyIdempotent
Current Brand API V2 data through generic or explicit routes. One request; credentialed asset src URLs are redacted from output. Provider reads may spend quota or crawl on a miss.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. | |
| allowNsfw | No | Optional provider NSFW behavior; absence differs from false. | |
| cachedOnly | No | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. | |
| identifier | Yes | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. | |
| identifier_type | No | Explicit provider route avoids identifier collisions. | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered. Beyond that, the description adds genuinely non-obvious behavior: credentialed asset src URLs are redacted from output, and provider reads may spend quota or crawl on a miss. It does not describe pagination or return shape, but the added context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense clauses with no filler; the request-count and redaction facts are stated up front. It is efficiently sized, though the opening clause is the vaguest part and could be more concrete.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of conveying what comes back, and it only says 'Brand API V2 data' plus a redaction note. Quota and routing behavior are covered, but an agent still cannot anticipate the returned brand fields, which is a real gap for a data-fetch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already carries a detailed description (identifier formats, cachedOnly/204 semantics, account inheritance, allowNsfw absence-vs-false). The description only alludes to 'generic or explicit routes,' adding minimal meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it fetches 'Current Brand API V2 data' and mentions generic vs explicit routes, so the verb and resource are implied. However, 'data' is generic and it never distinguishes itself from siblings like get_brand_context, get_brand_colors, or get_brand_fonts, so an agent cannot tell which brand-facing tool returns what.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no routing to alternatives such as get_brand_context or search_brands. The only contextual hints ('One request', 'may spend quota or crawl on a miss') describe cost behavior rather than when this tool should be chosen over its many siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_brand_colorsGet brand colorsARead-onlyIdempotent
One native brand read with only name, domain and colors returned. Filtering is local: provider quota and crawling behavior are unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. | |
| allowNsfw | No | Optional provider NSFW behavior; absence differs from false. | |
| cachedOnly | No | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. | |
| identifier | Yes | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. | |
| identifier_type | No | Explicit provider route avoids identifier collisions. | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), yet the description adds real behavioral context the annotations lack: a single native call, a reduced payload limited to three fields, and that quota/crawl behavior is unaffected. The "filtering is local" wording is slightly cryptic, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the scope statement front-loaded and no filler. Minor deduction because the second sentence references "filtering" that is never defined in the description or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-identifier tool with no output schema, disclosing the returned fields (name, domain, colors) usefully compensates for the absent output schema, and the 100%-covered input schema carries the parameter burden. The missing piece is routing guidance against the several similar brand siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so account, identifier, identifier_type, cachedOnly, and allowNsfw are all documented in the schema itself. The description adds only indirect meaning ("native read," "crawling") and no parameter-specific detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("One native brand read") and enumerates exactly what is returned (name, domain, colors), which lets an agent infer it is narrower than get_brand. However, it never names get_brand, get_brand_fonts, or get_logo_url, so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance and no explicit alternatives. The only context, "Filtering is local: provider quota and crawling behavior are unchanged," describes cost behavior, not selection criteria against get_brand or get_brand_fonts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_brand_contextGet interpreted brand contextARead-onlyIdempotent
One Brand Context API request. Context is probabilistic interpretation, not verified company facts. Accepts domain/email/URL; cachedOnly avoids crawling a miss.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain, URL or email address. | |
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. | |
| cachedOnly | No | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world, and non-destructive semantics. The description adds genuine behavioral context beyond them: the output is interpreted/probabilistic rather than factual, and cachedOnly prevents a crawl on a miss. It does not, however, mention auth/profile scoping or quota behavior in a way the schema doesn't already cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, with the important caveat (probabilistic, not verified) front-loaded. The lead phrase 'One Brand Context API request' adds little, but overall the text is tight and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should say more about the shape or reliability of what comes back than a single caveat sentence. The account/profile scoping behavior and any quota implications are left to the schema, so the definition is adequate but not complete for a 3-parameter tool with no return contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents domain, account, and cachedOnly in detail. The description's 'Accepts domain/email/URL' and 'cachedOnly avoids crawling a miss' restate the schema rather than adding new semantics. Baseline 3 applies 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (Brand Context API) and draws a meaningful line against get_brand by declaring the result is 'probabilistic interpretation, not verified company facts.' The opening 'One Brand Context API request' is somewhat tautological, but the scope and nature of the output are clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The probabilistic-vs-verified framing implies when this is preferable to get_brand, but the guidance is left to inference. There is no explicit statement of when to choose this over get_brand, search_brands, or prefetch_brand, so the routing signal is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_brand_fontsGet brand fontsARead-onlyIdempotent
One native brand read with only name, domain and fonts returned. Filtering is local: provider quota and crawling behavior are unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. | |
| allowNsfw | No | Optional provider NSFW behavior; absence differs from false. | |
| cachedOnly | No | True avoids crawling a cache miss; 204 is reported as cachedMiss. Indexed reads still consume quota. | |
| identifier | Yes | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. | |
| identifier_type | No | Explicit provider route avoids identifier collisions. | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower, and the description adds real value beyond them: the exact shape of the return (name, domain, fonts), that filtering happens locally, and that provider quota and crawling behavior are unaffected. It stops short of explaining what 'local filtering' operates on or how the cachedOnly path interacts with quota.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the return shape and followed by the quota/crawl note; nothing is padded. The phrase 'One native brand read' is slightly opaque phrasing that costs a little clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter read with no output schema and full schema coverage, the description usefully states the returned fields and the quota/crawl implications. It leaves the relationship to sibling brand tools and the meaning of local filtering unstated, which an agent would need to resolve elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents identifier formats, identifier_type routing, cachedOnly/204 behavior, allowNsfw, and account isolation. The description adds no parameter-level detail beyond the schema, which is the expected baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('brand read') and pins down the returned fields ('only name, domain and fonts'), which implicitly separates it from the broader get_brand and get_brand_colors siblings. However, it never names an alternative, so the differentiation must be inferred from the field list rather than read directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: nothing says when to prefer this over get_brand, get_brand_colors, or prefetch_brand. The only usage-adjacent statement is that filtering is local, which describes behavior rather than selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_logo_urlBuild a browser logo URLARead-onlyIdempotent
Local Logo API URL construction with the selected profile client ID. Direct browser display only; programmatic fetching these hotlinks is prohibited/blocked. No provider call or automatic download.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Legacy compatibility: true selects icon. Do not combine with type. | |
| type | No | Explicit asset type; separate from identifier_type. | logo |
| theme | No | ||
| width | No | ||
| format | No | SVG allowed only for logo or symbol. | |
| height | No | ||
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. | |
| fallback | No | 404 | |
| identifier | Yes | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. | |
| identifier_type | No | domain |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the description only needed to add beyond that, and it does: no provider call is made, nothing is downloaded, and hotlink fetching is blocked. Those are real operational facts not derivable from the annotations. It omits the return format, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose and followed by the restriction that matters most. No filler, though the wording could be tightened slightly ('programmatic fetching these hotlinks is prohibited/blocked' is a touch redundant).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool produces conceptually (a URL) and its usage restriction, which is the most important context given no output schema exists. However, with 10 parameters at 50% schema coverage and no output schema, an agent gets no guidance on how the returned URL varies with format, theme, dimensions, or fallback, leaving a real gap for a multi-parameter builder.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50% across 10 parameters, so the description carries a compensation burden it does not meet: it never explains identifier vs. identifier_type, theme, width/height, format restrictions, or fallback behavior. The lone relevant phrase, 'selected profile client ID,' does not even map cleanly to any named parameter (the closest is 'account', described as a private profile label).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (URL construction) on a specific resource (logo assets) using the selected profile client ID, so an agent knows this builds a URL rather than returning image data. It is somewhat jargon-heavy ('Local Logo API URL') and never names the sibling it contrasts with, such as download_brand_logos, but the core verb+resource pair is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage boundary: 'Direct browser display only; programmatic fetching these hotlinks is prohibited/blocked.' That is a genuine when/when-not constraint an agent must respect. It stops short of naming the correct alternative tool for actually retrieving logo bytes, so a 5 is not warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_operation_schemaInspect a native operationBRead-onlyIdempotent
Complete pinned Brandfetch path/query/body schema and documented response statuses for one of 11 supported native operations. Local only; agent purchases excluded.
| Name | Required | Description | Default |
|---|---|---|---|
| operation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description nonetheless adds real context: the schema is version-pinned, resolution is local-only, and agent purchases are explicitly out of scope — useful for an agent budgeting cost and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, densely front-loaded with what is returned before the scoping caveat. No filler, though the clipped 'Local only; agent purchases excluded' fragment is slightly telegraphic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description is the only place to learn what comes back, and 'schema and documented response statuses' is a fair start. It stops short of describing the returned structure or how to apply it before invoking preview_operation, and the enum values remain unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required 'operation' parameter, so the description must carry that burden. It only corroborates the enum size ('one of 11 supported native operations') and adds nothing about what the individual operation values mean or how they map to the sibling tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource — the pinned Brandfetch path/query/body schema plus documented response statuses — for one of 11 native operations, which is concrete and distinguishable from the execution-oriented siblings. It differentiates only implicitly, via 'agent purchases excluded', rather than naming preview_operation directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Local only; agent purchases excluded' implies this is the no-cost inspection path versus actually invoking an operation, but it never names preview_operation or states 'call this before running an operation to learn its inputs.' Usage is implied, not prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_viewerVerify Brand API identityARead-onlyIdempotent
GET /v2/viewer using the selected private Brand API key. Returns provider viewer metadata; does not purchase access or expose the key.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint:false, covering safety. The description adds that it does not purchase access or expose the key, which provides useful context about side effects and security. It stops short of specifying rate limits or return metadata details, but this is reasonable given no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: the first states the action and auth, the second clarifies non-effects. No wasted words, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity (one optional parameter, no output schema) and rich annotations, the description is nearly complete. It covers purpose, auth context, and non-effects. Minor gap: it could mention that it returns viewer metadata, but that is already stated. No major omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single parameter 'account' is fully documented with its inheritance behavior. The description does not add further parameter details, but it correctly implies the optional nature via 'selected private Brand API key' and the empty required list. The baseline for 0 required params with high coverage is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (GET), resource (/v2/viewer), and the exact authentication context (selected private Brand API key). This clearly distinguishes it from siblings like get_brand or search_brands, which operate on brand data rather than identity verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: verifying identity of the currently selected API key. However, it does not explicitly state when to call this versus alternatives, nor does it provide exclusions or prerequisites beyond the auth context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList private profilesBRead-onlyIdempotent
Local labels, default and credential method availability only. No keys, client IDs, private paths or network.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new information beyond those: it is local-only, excludes keys, client IDs and private paths, and performs no network access, which is a meaningful security disclosure for a credentials-adjacent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loads the scope constraint, but the telegraphic phrasing ('Local labels, default and credential method availability only') reads as a fragment and is ambiguous about what is a field versus what is excluded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden; it partially does by naming the exposed fields, but it never defines what an 'account' is, whether multiple accounts are returned, or the ordering/shape of results. Adequate but incomplete for a listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters with 100% schema coverage, so there is nothing for the description to disambiguate. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The name/title state the verb and resource, but the description itself only enumerates returned fields (labels, default flag, credential method availability) rather than saying outright that it lists configured accounts. An agent can infer the purpose, but it is never stated, and no sibling (all brand-oriented tools) is referenced for differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus alternatives, no prerequisites, and no mention of any sibling tool. The agent must guess from the name alone that this is the entry point for discovering credentials/accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prefetch_brandPrefetch a brandBDestructive
Explicitly confirmed HEAD request can enqueue a provider crawl. Generic or domain route only. Return 200 indexed / 202 crawl queued; never poll, purchase or resubmit automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. | |
| confirm | No | Must be true for this exact provider crawl request. | |
| identifier | Yes | Domain, email, URL, Brand ID, ticker, ISIN or crypto symbol. Explicit types accept only their identifier format. | |
| identifier_type | No | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is partly covered. The description materially adds to that by disclosing the external side effect (provider crawl enqueue), the exact return codes (200 indexed / 202 queued), and explicit non-behaviors ('never poll, purchase or resubmit automatically').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three terse sentences with no filler, and the triggering condition and constraints are front-loaded. It is slightly telegraphic, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a non-idempotent, destructive external action, the return-code note helps fill the response gap. Still missing are the consequence of a queued (202) result for the caller and any mention of the account profile requirement, both of which an agent needs at call time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, which already documents account, confirm, identifier and identifier_type. The description only echoes two of these ('explicitly confirmed' for confirm, 'generic or domain route only' for the enum), adding marginal value beyond the schema rather than compensating for the missing remainder.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('can enqueue a provider crawl') and scope ('generic or domain route only'), and ties itself to a HEAD request. However, it never plainly says it warms/prefetches a brand record and does not contrast itself with siblings like get_brand or get_brand_context, so an agent must infer the relationship between 'prefetch' and 'enqueue a crawl'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage via 'explicitly confirmed' (linking to the confirm parameter) and constrains routing with 'generic or domain route only', plus a caution against polling/purchasing/resubmitting. But it never says when to choose this over get_brand or search_brands, so the alternative 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.
preview_operationPreview a native requestBRead-onlyIdempotent
Validate one exact native operation request locally, without loading keys/client IDs, contacting Brandfetch, reserving files or claiming provider validation or price. Search c is added from private profile at execution.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | Yes | Native path/query arguments and transaction payload. Inspect get_operation_schema first. | |
| operation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, but the description adds real behavioral detail beyond them: no keys/client IDs loaded, no Brandfetch contact, no file reservation, and explicitly disclaiming provider validation or pricing. This is valuable disambiguation for a 'preview' tool that could be mistaken for a real request.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is front-loaded and dense with useful disclaimers, but it is a run-on list. The second sentence ('Search c is added from private profile at execution') is ambiguous and near-garbled, costing clarity for unclear benefit.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should ideally explain what a 'validation' returns (pass/fail, error details), which it omits. For a tool with a nested arguments object and an 11-value enum, the negative-space clarifications are helpful but the success/return semantics and the meaning of the final sentence remain unclear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 50% schema coverage across two required parameters, the description carries meaningful burden but adds nothing about either parameter. The 'operation' enum is self-describing and 'arguments' is documented in the schema (pointing to get_operation_schema), so the description neither compensates for the coverage gap nor clarifies the expected request shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate/preview) and resource (one exact native operation request) with explicit scope ('locally'). It distinguishes itself from actual execution by listing what it does not do, though it does not name sibling tools like get_operation_schema in the description itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage as a pre-flight validation step before executing a native operation, and the schema's 'Inspect get_operation_schema first' hints at ordering. However, the description never explicitly states when to choose this over siblings or the conditions/recommended workflow, and the cryptic 'Search c is added from private profile at execution' adds no actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_brandsSearch brandsBRead-onlyIdempotent
Search by name with the selected profile client ID in native query c. No Brand API Bearer key sent. One request; no pagination or retries.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Brand name to search. | |
| account | No | Exact private profile label. Never inherits another profile or global key/client ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses real behavioral context: no Brand API Bearer key is sent (auth profile) and the call is a single request with no pagination or retries. That meaningfully extends readOnlyHint/idempotentHint, though it omits anything about result shape or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and free of padding. The only drag is the cryptic 'native query c' phrase, which is wasted space an agent cannot act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should carry return-value information, but it says nothing about what a search returns or how results are shaped. It covers the request side (single call, no retries) adequately but leaves the response side to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, establishing a baseline of 3. The description's 'by name' and 'selected profile client ID' loosely frame the query and account parameters but add no syntax, format, or matching-rule detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description says 'Search by name', which gives a verb and implies the resource, but never explicitly states it searches brands and instead drops opaque implementation jargon ('in native query c'). It distinguishes itself only implicitly from get_brand, which returns a single brand, rather than spelling out the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus the many siblings such as get_brand, prefetch_brand, or compare_brands. The 'One request; no pagination or retries' line describes behavior rather than guiding tool selection, so an agent gets no routing help.
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.
14 tool updates
v2.0.0- First observed
compare_brands - First observed
download_brand_logos - First observed
enrich_transaction - First observed
get_brand - First observed
get_brand_colors - First observed
get_brand_context - First observed
get_brand_fonts - First observed
get_logo_url - First observed
get_operation_schema - First observed
get_viewer - First observed
list_accounts - First observed
prefetch_brand - First observed
preview_operation - First observed
search_brands
TDQS
Scored across 14 tools
Several tools perform the same underlying native brand read: get_brand, get_brand_colors, and get_brand_fonts are explicitly the same provider call with local output filtering, so an agent may struggle to choose between them. get_brand_context, search_brands, and prefetch_brand are reasonably distinct, and the verbose descriptions do help disambiguate, but the overlapping brand-read family caps this score.
Every tool uses a consistent snake_case verb_noun pattern (get_brand, search_brands, enrich_transaction, download_brand_logos, list_accounts). The verb choices are predictable and the pattern holds across all 14 tools with no mixed conventions.
14 tools is within the well-scoped 3-15 range and each nominally earns a place. However, the colors/fonts wrappers and the meta tools (get_operation_schema, preview_operation) feel somewhat padded relative to the core brand-data surface.
The surface covers the brand lifecycle well: lookup, search, context, colors, fonts, logo URL construction, logo download, comparison, transaction enrichment, prefetch, plus schema/preview helpers. Minor gaps exist (no font download, limited account operations), but core workflows are covered.
Maintenance
Related MCP Connectors
A read-only verified record of agent-operable GTM tools: search, fetch, compare, track changes.
Your brand's Styles, logos and asset library in your AI app, for on-brand assets that match.
Brand-safe MCP for AI agents to create editable, on-brand graphics and automate variants.
- SkilderOAuthai.skilder
One place to build, share, and govern the skills and tools your AI agents use at work.
Related MCP Servers
AlicenseAqualityCmaintenanceEnables AI agents to create, manage, and publish brand kits with colors, typography, logos, and white-label branding via the BrandKity platform.2255 npm2MIT- AlicenseNot gradedqualityDmaintenanceA memory-backed brand generation runtime for agent-led creative iteration. Enables AI agents to plan, generate, review, and improve brand materials with persistent brand memory and structured workflows.MIT
- AlicenseNot gradedqualityCmaintenanceA Model Context Protocol server that exposes a versioned brand package (tokens, rules, recipes, media rights, and audit gates) as resources, tools, and prompts for AI agents. It enables agents to plan and audit on-brand UI, image, motion, and video outputs while remaining read-only and credential-free.MIT
- AlicenseNot gradedqualityCmaintenanceEnables coding agents to onboard a brand, generate and edit prompts, launch AI-visibility runs across multiple engines in the background, and pull daily reports, trends, gaps and raw answers. It exposes brand positioning metrics such as visibility, sentiment, citations and share of voice as callable tools.20 npmMIT