MCP Server
Connect AI assistants to the Quikturn logo database via Model Context Protocol
The Quikturn MCP server gives AI agents direct access to the logo database. Any MCP-compatible client can search for company logos, retrieve them as public PNG URLs or base64 image data, fetch logos in batch, and submit feedback.
Single endpoint: https://logos.getquikturn.io/mcp — this is the only URL you need.
Quick Start
Create Your Account
Sign up here to create your Quikturn account. The Free tier includes MCP access with 50 requests/day and 30 unique companies/day.
Configure Your MCP Client
- Open claude.ai or Claude Desktop
- Navigate to Settings → Connectors
- Click Add → Add custom connector
- Enter the URL:
https://logos.getquikturn.io/mcp - Sign in with your Quikturn account when prompted and approve the consent screen
- Start using logo tools in any conversation
Network egress: Go to Settings → Capabilities, enable network egress for code execution, and add *.getquikturn.io to the domain allowlist.
Use the Tools
Once connected, your AI agent has access to seven tools:
Agent: "Find the Apple logo"
→ calls search_logos(query: "Apple")
→ calls fetch_logo(query: "apple.com")
→ returns PNG URL for download or base64 for embeddingAuthentication
OAuth 2.1 (Primary)
The MCP server uses OAuth 2.1 for authentication. When you add the connector, your MCP client handles the OAuth flow automatically:
- Client discovers the OAuth server via
/.well-known/oauth-protected-resource - Client redirects you to sign in with your Quikturn account
- You approve access on the consent screen
- Client receives an access token and uses it for all subsequent requests
No API keys needed — just sign in with your Quikturn account.
Plan Requirements
| Plan | MCP Access | Rate Limit | Daily Unique Companies |
|---|---|---|---|
| Free | Yes | 50 requests/day | 30 |
| Launch | Yes | 1,000 req/min | Included in quota |
| Growth | Yes | 10,000 req/min | Included in quota |
| Enterprise | Yes | 100,000 req/min | Custom |
Free tier daily limit resets at midnight UTC. Rate limit exceeded returns HTTP 429 with a Retry-After: 60 header.
One MCP HTTP call consumes one mcp_request. Distinct companies resolved by fetch_logo, get_logo, get_company_logos, insert_logo, and fetch_logos share the same unique-company accounting. Search-only results do not consume unique-company quota.
Transport
| Property | Value |
|---|---|
| Protocol | Model Context Protocol (MCP) over Streamable HTTP |
| Endpoint | POST https://logos.getquikturn.io/mcp |
| Content-Type | application/json (JSON-RPC 2.0) |
| Accept | application/json, text/event-stream (required) |
| Body limit | 1 MB |
| Mode | Stateless — each request is independent, no server-side sessions |
Tools Reference
search_logos
Search the logo database by company name, domain, or ticker symbol. Returns metadata only — no image data.
Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
query | string (max 500 chars) | Yes | — | Search query (company name, domain, or ticker) |
limit | number | No | 5 | Number of results to return (1–20) |
Example call:
{
"query": "Microsoft",
"limit": 3
}Response:
{
"results": [
{
"logoId": 456,
"companyId": 123,
"companyName": "Microsoft Corporation",
"domain": "microsoft.com",
"variant": "full",
"sourceWidth": 1200,
"sourceHeight": 600
}
]
}Results include companyId so you can call get_company_logos for all logos from that company. The variant field indicates whether the logo is a full wordmark ("full") or icon-only ("icon"). Search results intentionally omit delivery fields such as format, mimeType, url, and resourceUri; call a fetch tool to get those fields.
fetch_logo
Fetch a single company logo by name, domain, or ticker. Returns the logo as a public permanent PNG URL or base64-encoded image data.
Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | — | Company name, domain, or ticker (e.g., "apple.com", "Apple", "AAPL") |
variant | "full" or "icon" | No | — | Preferred logo variant; falls back to best available if unavailable, setting variantFallback: true in the response |
maxWidth | number | No | — | Maximum pixel width (1–3200). Scale-down only; never upscales. |
returnType | "url" or "base64" | No | "url" | How to deliver the image |
Example call:
{
"query": "apple.com",
"maxWidth": 400
}Response:
{
"ok": true,
"logoId": 789,
"companyId": 42,
"companyName": "Apple Inc.",
"domain": "apple.com",
"variant": "full",
"format": "png",
"mimeType": "image/png",
"url": "https://logos.getquikturn.io/assets/bG9nb3MvYXBwbGUuY29tLnBuZw?maxWidth=400",
"resourceUri": "qt://logo/789?maxWidth=400",
"width": 400,
"height": 400,
"sourceWidth": 1024,
"sourceHeight": 1024,
"dimensionsStatus": "known"
}fetch_logo is the simplest way to get a logo — just provide a query. Use search_logos when you need to browse multiple results.
get_logo
Retrieve a specific logo. By default returns a public permanent PNG URL. Optionally returns base64-encoded image data or an Anthropic Files API file_id.
Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
logoId | number | Yes | — | Logo ID from search_logos results |
maxWidth | number | No | — | Maximum pixel width (1–3200). Scale-down only; never upscales. Aspect ratio preserved. |
returnType | "url" | "base64" | "file" | No | "url" | How to deliver the image |
Request:
{
"logoId": 456,
"maxWidth": 400
}Response:
{
"logoId": 456,
"companyId": 123,
"companyName": "Microsoft Corporation",
"domain": "microsoft.com",
"variant": "full",
"format": "png",
"mimeType": "image/png",
"url": "https://logos.getquikturn.io/assets/bG9nb3MvbWljcm9zb2Z0LmNvbS5wbmc?maxWidth=400",
"resourceUri": "qt://logo/456?maxWidth=400",
"width": 400,
"height": 200,
"sourceWidth": 1200,
"sourceHeight": 600,
"dimensionsStatus": "known"
}The URL is public, permanent, and unsigned — no credentials or tokens appear in it. You can save it, share it, or embed it directly in documents.
Every successful get_logo response includes the public url. Base64 mode adds base64; file mode adds file_id when the Files API upload succeeds and otherwise falls back to base64.
When to use each mode
| Mode | Use case | Trade-off |
|---|---|---|
url (default) | Downloading logos, embedding in documents, inserting into slides | Public permanent URL; requires HTTP fetch to get bytes |
base64 | Inline embedding where URLs aren't supported (e.g., some MCP resource contexts) | Larger payload over JSON-RPC; 5 MB file size limit |
file | Provider-specific server integration | The server uploads the PNG via its own Anthropic Files API key and returns a file_id; only usable when the surrounding workflow is configured to consume that ID. Prefer url or base64 for general MCP clients. |
URL-first workflow: Use the URL to download the PNG directly via curl, fetch, or your browser. The URL returns image/png bytes — not a redirect.
Logos larger than 5 MB are rejected in base64 mode with a suggestion to use URL mode instead.
Output dimensions
When maxWidth is provided and is smaller than the source width, the output is scaled down proportionally. When maxWidth is omitted or larger than the source, the logo is served at its original dimensions. The response includes both width/height (output) and sourceWidth/sourceHeight (original) so you know exactly what you're getting.
dimensionsStatus is "known" when source dimensions are available from stored metadata or image inspection. It is "unknown" when they cannot be determined; in that case the dimension fields may be null.
get_company_logos
Get all logo variants for a specific company. Returns metadata and public URLs for each variant.
Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
companyId | number | Yes | — | Company ID from search_logos results |
variant | "full" or "icon" | No | — | Filter to only full logos or only icons |
Example call:
{
"companyId": 123,
"variant": "icon"
}Response:
{
"logos": [
{
"logoId": 457,
"companyId": 123,
"companyName": "Microsoft Corporation",
"domain": "microsoft.com",
"variant": "icon",
"format": "png",
"mimeType": "image/png",
"url": "https://logos.getquikturn.io/assets/bG9nb3MvbWljcm9zb2Z0LmNvbS1pY29uLnBuZw",
"resourceUri": "qt://logo/457",
"sourceWidth": 256,
"sourceHeight": 256
}
],
"_meta": {
"usage": {
"requests": { "current": 15, "limit": 50 },
"companies": { "current": 9, "limit": 30 }
}
}
}get_company_logos optionally includes _meta.usage when the server has authenticated MCP context. It reports your current request and unique-company counts against plan limits. Only get_company_logos and insert_logo expose this usage summary.
insert_logo
Search for a company logo and prepare it for insertion onto the current PowerPoint slide. Returns a file_id (uploaded to Anthropic's Files API) and step-by-step instructions for the agent to complete the insertion.
Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
query | string (max 500 chars) | Yes | — | Company name, domain, or ticker to search for |
imageWidth | number | No | 150 | Width in points for the inserted image |
imageHeight | number | No | auto | Height in points (auto-calculated from aspect ratio if omitted) |
imageLeft | number | No | 300 | Left position in points (roughly centered) |
imageTop | number | No | 200 | Top position in points (roughly centered) |
Example call:
{
"query": "Salesforce",
"imageWidth": 200,
"imageHeight": 200
}Response:
{
"file_id": "file-abc123",
"blob_name": "quikturn_logo_789",
"companyName": "Salesforce, Inc.",
"instructions": "**Step 1:** Call store_blob with these parameters:\n- file_id: \"file-abc123\"\n- blob_name: \"quikturn_logo_789\"\n\n**Step 2:** Call execute_office_js with this code:\n```\nconst b64 = blobs.getBase64(\"quikturn_logo_789\");\nawait insertImage(b64, { imageLeft: 300, imageTop: 200, imageWidth: 200, imageHeight: 200 });\n```",
"_meta": {
"usage": {
"requests": { "current": 12, "limit": 50 },
"companies": { "current": 8, "limit": 30 }
}
}
}insert_logo optionally includes _meta.usage when the server has authenticated MCP context. It reports your current request and unique-company counts against plan limits. Only get_company_logos and insert_logo expose this usage summary.
This tool is designed for the Quikturn PowerPoint Add-in agent flow. After calling insert_logo, the agent must follow the returned instructions — first calling store_blob with the file_id, then execute_office_js with the provided code. Do not attempt to embed base64 data directly.
fetch_logos
Batch-retrieve logos for multiple domains in a single call. Preserves input order and reports partial failures individually.
Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
domains | string[] | Yes | — | Array of company domains to fetch logos for |
variant | "full" or "icon" | No | — | Preferred logo variant applied to all domains; falls back to best available per domain, setting variantFallback: true on that result |
returnType | "url" or "base64" | No | "url" | How to deliver images (max 25 domains for URL, max 5 for base64) |
maxWidth | number | No | — | Maximum pixel width (1–3200), applied to all results |
Example call:
{
"domains": ["apple.com", "google.com", "nonexistent.example"],
"maxWidth": 200
}Response:
{
"results": [
{
"domain": "apple.com",
"ok": true,
"companyId": 42,
"companyName": "Apple Inc.",
"resolvedDomain": "apple.com",
"logoId": 789,
"variant": "full",
"format": "png",
"mimeType": "image/png",
"url": "https://logos.getquikturn.io/assets/bG9nb3MvYXBwbGUuY29tLnBuZw?maxWidth=200",
"resourceUri": "qt://logo/789?maxWidth=200",
"width": 200,
"height": 200,
"sourceWidth": 1024,
"sourceHeight": 1024,
"dimensionsStatus": "known"
},
{
"domain": "google.com",
"ok": true,
"companyId": 55,
"companyName": "Alphabet Inc.",
"resolvedDomain": "google.com",
"logoId": 1024,
"variant": "full",
"format": "png",
"mimeType": "image/png",
"url": "https://logos.getquikturn.io/assets/bG9nb3MvZ29vZ2xlLmNvbS5wbmc?maxWidth=200",
"resourceUri": "qt://logo/1024?maxWidth=200",
"width": 200,
"height": 100,
"sourceWidth": 800,
"sourceHeight": 400,
"dimensionsStatus": "known"
},
{
"domain": "nonexistent.example",
"ok": false,
"error": "No company found for domain"
}
],
"summary": {
"requested": 3,
"resolved": 2,
"failed": 1
}
}Results preserve input order. Each domain reports independently — a failure for one domain does not affect others. Duplicate resolved company IDs consume unique-company quota only once.
When using returnType: "base64", the combined encoded payload of all results must not exceed 5 MB. Use URL mode for large batches.
send_feedback
Submit feedback about data quality, bugs, or feature requests.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
category | "data_quality" | "bug" | "feature_request" | "other" | Yes | Feedback category |
message | string (max 5000 chars) | Yes | Feedback message |
domain | string | No | Related company domain |
logoId | number | No | Related logo ID |
tool | string | No | Tool that triggered the feedback |
Example call:
{
"category": "data_quality",
"message": "The Microsoft logo returned for logoId 456 is outdated — it shows the pre-2012 version.",
"logoId": 456,
"domain": "microsoft.com"
}Response:
{
"ok": true,
"remaining": 4,
"referenceId": "fb-42-1787961600000",
"timestamp": "2026-08-29T00:00:00.000Z",
"serverVersion": "1.0.0"
}Feedback is limited to 5 submissions per client per UTC calendar day. Authenticated metadata (account, client) is attached automatically.
Resource URIs
The MCP server exposes logo resources via the URI scheme:
qt://logo/{logoId}?maxWidth=N- Output is always PNG.
maxWidthis optional (1–3200). Scale-down only; never upscales.- Resource reads return base64-encoded PNG data via JSON-RPC, providing a fallback for clients that cannot download the public URL directly.
- Rendered resources exceeding 5 MB are rejected with a suggestion to use the public URL or a lower
maxWidth.
Resource links included in tool responses (via structuredContent) provide qt://logo/... URIs that clients can resolve on demand. This is a base64 JSON-RPC fallback — not true binary streaming. For large or batch downloads, use the public PNG URLs directly.
Public Logo Assets
Logo images are served as public, permanent, unsigned PNG files from the transform URL:
https://logos.getquikturn.io/assets/{base64urlKey}?maxWidth=N| Property | Value |
|---|---|
| Response | image/png bytes (not a redirect) |
| Cache | Cache-Control: public, immutable with ETag |
| CORS | Suitable for public embedding |
| maxWidth | Optional, 1–3200, scale-down only, aspect ratio preserved |
| Credentials | None — URLs are public and require no authentication |
The {base64urlKey} is an unpadded base64url encoding of the R2 object key, restricted to logo-object prefixes.
Downloading logos
Use any HTTP client to download:
# Download a logo PNG
curl -o logo.png "https://logos.getquikturn.io/assets/bG9nb3MvYXBwbGUuY29tLnBuZw?maxWidth=400"
# Verify it's a valid PNG
file logo.png
# → logo.png: PNG image data, 400 x 200, ...These URLs can be embedded directly in HTML, Markdown, slides, or documents.
Typical Workflows
URL-First Download
The recommended workflow for most use cases:
1. search_logos(query: "Acme Corp")
→ Get list of matching logos with metadata
2. get_logo(logoId: 456, maxWidth: 800)
→ Get a public permanent PNG URL
3. Download the PNG via the URL (curl, fetch, browser, etc.)
→ Insert into your document, slide, or appEmbedded Document Workflow
For contexts where you need inline image data:
1. search_logos(query: "Acme Corp")
→ Get list of matching logos
2. get_logo(logoId: 456, returnType: "base64")
→ Get base64-encoded PNG data
3. Embed the base64 data directly (e.g., data URI, PowerPoint insert)Batch Logos
1. fetch_logos(domains: ["apple.com", "google.com", "microsoft.com"], maxWidth: 200)
→ Get all logos in one call, preserving input order
2. Download the returned PNG URLs
→ Insert into your document or appBrowse All Variants
1. search_logos(query: "Acme Corp")
→ Note the companyId from results
2. get_company_logos(companyId: 123)
→ See all available logos (full wordmarks, icons, etc.)
3. get_logo(logoId: chosen_id)
→ Fetch the one you wantStructured Output
Successful tool responses include both structuredContent (machine-readable typed content blocks) and equivalent JSON text. Clients that support structured content get richer rendering; others fall back to the JSON text representation. Error responses return isError: true with a text message only.
Error Reference
Tool-Level Errors
When a tool encounters an error, it returns an MCP error response with isError: true and a human-readable message.
| Scenario | Error Message |
|---|---|
| Logo not found | Logo with ID 123 not found |
| Company not found | No company found with ID 456 |
| Image retrieval failed | Unable to retrieve image. Try again or use returnType: 'url' |
| Logo file exceeds 5 MB (base64 mode) | Logo file exceeds 5MB. Use returnType: 'url' instead |
Resource exceeds 5 MB (qt://logo/ read) | Rendered logo exceeds 5MB. Use the public URL or a lower maxWidth. |
Batch base64 aggregate exceeds 5 MB (fetch_logos) | Aggregate base64 payload size exceeds 5MB limit |
| Search service failure | Search failed. Try again later |
| Feedback rate limited | Daily feedback limit (5) exceeded. Try again tomorrow. |
| Daily unique-company quota exceeded | Daily company limit ({limit}) exceeded. You've accessed {current} unique companies today. Resets at {ISO timestamp}. |
| Quota service temporarily unavailable | Quota service temporarily unavailable. Try again later. |
| Unexpected error | Failed to get logo. Try again later |
HTTP-Level Errors
These occur before the MCP handler runs (auth/rate limit failures):
| Status | Scenario | Body |
|---|---|---|
| 401 | Missing or invalid token | {"error": "Authorization required"} |
| 401 | Expired or revoked token | {"error": "Invalid or expired token"} |
| 403 | No API client associated | {"error": "No API client associated with this account"} |
| 403 | Plan doesn't include MCP | {"error": "Your plan does not include MCP access"} |
| 429 | Rate limit exceeded | {"error": "Rate limit exceeded"} + Retry-After: 60 header |
| 429 | Free tier daily cap | {"error": "Daily limit of 50 requests exceeded. Upgrade your plan for higher limits."} |
| 500 | Internal server error | {"error": "Internal MCP server error"} |
Testing Your Connection
curl examples require a valid OAuth access token. Obtain one by completing the OAuth flow through your browser, then use the access_token from the token response.
All curl examples require the header Accept: application/json, text/event-stream.
List Available Tools
curl -X POST https://logos.getquikturn.io/mcp \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}'Search for Logos
curl -X POST https://logos.getquikturn.io/mcp \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "search_logos",
"arguments": {
"query": "Apple",
"limit": 3
}
}
}'Fetch a Logo URL
curl -X POST https://logos.getquikturn.io/mcp \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_logo",
"arguments": {
"logoId": 123,
"maxWidth": 400
}
}
}'Verify a Public Logo URL
# Download and verify the PNG
curl -o logo.png "https://logos.getquikturn.io/assets/bG9nb3MvYXBwbGUuY29tLnBuZw?maxWidth=400"
file logo.pngUsing the MCP Inspector
The MCP Inspector provides a web UI for testing MCP servers:
npx @modelcontextprotocol/inspectorEnter the server URL (https://logos.getquikturn.io/mcp). The inspector will guide you through OAuth authentication.