FrameAnyPhoto
Server Details
Shop for and buy framed museum-quality prints of public-domain art and photos, shipped US-wide.
- Status
- Healthy
- Uptime
- 97.1% over 23 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-03-26
- URL
- Repository
- morgangoins/frameanyphoto-mcp
- GitHub Stars
- 0
- Server Listing
- FrameAnyPhoto MCP Server
TDQS
Scored across 8 tools
Most tools are clearly separated by resource and action: search/get work, get options, quote, checkout, status, policies, and series listing. The only mild overlap is between get_print_options and quote_order, since both return pricing information, but their descriptions distinguish per-work options from order-level totals.
All names are snake_case and follow a predictable verb_noun pattern: create_checkout, get_order_status, get_policies, get_print_options, get_work, list_series, quote_order, search_works. The set uses a small, consistent vocabulary of verbs.
Eight tools is well-scoped for a print-ordering storefront: browsing, options, quoting, checkout, status, and policy lookup are each covered without excess. Each tool appears to earn its place.
The surface covers the expected end-to-end workflow: search and retrieve works, list series, inspect print options, quote an order, create checkout, check order status, and retrieve policies. No obvious lifecycle gap prevents an agent from completing a purchase-support flow.
Available Tools
8 toolscreate_checkoutCreate checkout linkAInspect
Create a Stripe Checkout pay link for this order. Returns message_for_user (one ready-to-send line with the link, price, and delivery time), payment_url, order_ref, and the store policies. Send message_for_user to your user in your reply: they open payment_url, enter the address, and pay on Stripe. This never charges a card. Rate-limited.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | size_id from get_print_options, or Small, Medium, Large. Default: the site default (Large when the scan allows) | |
| work | Yes | Prefer ascii_id (the slug) from search_works or get_work; the id with or without its en dash, a /w/ URL, exact title, accession, or NASA ID also work | |
| No | Optional buyer email to prefill | ||
| frame | No | frame_id from get_print_options. Default: the work's default frame | |
| quantity | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only confirm it is a write operation), the description provides vital behavioral context: it details exactly what the returned object contains (URL, reference, policies), the safety net that it 'never charges a card,' and an operational limit ('Rate-limited').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient and dense with necessary information, fitting the function into a single cohesive paragraph without unnecessary jargon. The most important information (no charge, rate-limited) is well-placed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is a high-level payment creation tool, the description is highly complete. It explains the input purpose, the output structure (what data to extract), and the required external user interaction (sending the message).
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?
While the schema covers the inputs, the description effectively links these inputs (like size and work) to the final financial outcome and the specific data points returned, adding context about the end-to-end process.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly and specifically states the purpose: to create a Stripe Checkout pay link. This distinguishes it immediately from sibling tools like 'get_work' or 'quote_order' by focusing on the creation of a payment mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear instructions on how to use the resulting data, specifically directing the agent to send 'message_for_user' to the user in its reply. It also clarifies a critical functional constraint: 'This never charges a card.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_order_statusOrder statusARead-onlyInspect
Checkout, payment, and shipping status for an order_ref from create_checkout. Returns no personal data.
| Name | Required | Description | Default |
|---|---|---|---|
| order_ref | Yes | order_ref from create_checkout |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds a genuine behavioral fact beyond the structured fields: it returns no personal data, which is useful privacy context. It does not cover behavior on unknown or expired order_refs or any rate limits.
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, no filler, with the returned-status facets front-loaded. Every clause carries information that is not duplicated elsewhere in the structured fields.
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, yet the description compensates by enumerating what is returned (checkout, payment, shipping status) and noting the absence of personal data. For a one-parameter read-only tool this is nearly complete, with only error/not-found behavior left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is fully documented, so the baseline is 3. The description's phrase 'for an order_ref from create_checkout' simply repeats the schema's own parameter description verbatim, adding no new meaning or format constraints.
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 the specific resource and the three status facets returned (checkout, payment, shipping), which is far more informative than the title 'Order status'. It implicitly distinguishes itself from write-side siblings like create_checkout and quote_order, but never states a verb or an explicit contrast with the other read siblings.
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?
Naming 'an order_ref from create_checkout' gives clear context for when this tool is applicable, i.e. after checkout creation. There is no explicit when-not guidance or pointer to an alternative tool for other lookup needs, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_policiesStore policiesBRead-onlyInspect
Store policies as JSON: shipping (free, US only, 14–21 days), returns (30-day money back by mail; buyer pays return shipping), payment (Stripe Checkout), sales tax, and contact.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered and the description only needs to add context. It usefully discloses that the response is JSON and scopes the policy content, but says nothing about whether these are static values, where they come from, or whether all keys are always present.
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?
A single front-loaded sentence that opens with the resource and format, then packs the policy inventory into a compact parenthetical list. The detail is dense but every clause maps to actual returned content, so it earns its space.
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 no parameters, the description carries the job of conveying return values — and it does so by enumerating the policy sections returned as JSON. Minor gaps remain (no statement that the content is static/authoritative or what the contact field contains), but an agent can call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline the schema carries no semantic burden and the description has nothing parameter-related to explain. Nothing is missing here.
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 the resource (store policies) and the return format (JSON), then enumerates the exact policy topics covered, so an agent knows precisely what this tool yields. The verb is only implied by the name, and no sibling (create_checkout, quote_order, etc.) shares this domain, so explicit differentiation isn't needed.
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 statement, no trigger condition (e.g. 'call when the user asks about shipping, returns, or payment terms'), and no mention of alternatives. Usage is only inferable from the content list, which is weaker than explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_print_optionsPrint optionsARead-onlyInspect
Sizes, frames, and prices the site offers for one work. Sizes respect the scan's resolution (100 PPI minimum). Prices include the frame and shipping; tax is added at checkout.
| Name | Required | Description | Default |
|---|---|---|---|
| work | Yes | Prefer ascii_id (the slug) from search_works or get_work; the id with or without its en dash, a /w/ URL, exact title, accession, or NASA ID also work |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint=true, openWorldHint=false), so the bar is lower, and the description still adds real behavior: sizes are capped by scan resolution (100 PPI minimum) and prices bundle frame and shipping but exclude tax, which is added at checkout. That is exactly the kind of context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler; the pricing caveat (tax at checkout) is the kind of detail that prevents a wrong answer and it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only one fully documented parameter, the description carries the return-value burden and does it reasonably well by summarizing sizes, frames, prices, and the resolution constraint. It could go slightly further on what happens when no print options exist for a work.
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 accepted id forms (slug, en-dash id, /w/ URL, title, accession, NASA ID) are already documented in the schema. The description adds nothing about the work parameter, 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 concretely what the tool returns for one work: the sizes, frame options, and prices the site offers. That is clear verb+resource framing and it is a read tool ('get'), but it never explicitly distinguishes itself from sibling quote_order, which also sounds pricing-related.
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: an agent can infer you call this when you need purchasable print options for a known work. There is no statement of when not to use it and no routing to alternatives such as quote_order or get_work, which is the main gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workGet workBRead-onlyInspect
Return one work by id, title, accession number, or NASA ID.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Exact id, title, accession, or NASA ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds only that the result is a single work and the keys are exact matches; it does not say what happens on a miss (error vs. empty) or whether the match is exact or fuzzy. Modest value beyond 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?
A single short sentence with the action front-loaded and the lookup keys following. No padding, though the brevity comes partly from omitting differentiation from siblings.
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 one-parameter read tool with full schema coverage and a readOnly annotation, the bar is low, but the description still omits the return shape, not-found behavior, and how it differs from search_works — the most likely point of agent confusion among the 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% and the parameter is documented as 'Exact id, title, accession, or NASA ID'. The description restates the same four key types, adding essentially no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return one work') and enumerates the four lookup keys (id, title, accession, NASA ID). The word 'one' implicitly contrasts with the sibling search_works, but no sibling is named 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?
Usage is only implied: 'Return one work by id, title, accession number, or NASA ID' suggests a single-record exact lookup, which contrasts with the list-style siblings (search_works, list_series). However, there is no explicit 'use this when... / use search_works instead when...' statement, so the agent must infer the splitting condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_seriesList seriesBRead-onlyInspect
List collection rows and how many works each contains.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description usefully adds that rows are returned with per-series work counts, which is a return-shape hint, but says nothing about ordering, pagination, or how many series come back.
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?
A single short sentence with no filler, front-loading the verb and the payload returned. Minor wording inconsistency between 'series' (name/title) and 'collection rows' costs it a perfect score.
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 zero-parameter, read-only listing tool with no output schema, the description conveys what comes back (rows plus work counts), which is the main thing an agent needs. Ordering/pagination behavior is not covered but is low-stakes here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly implies an unfiltered full listing.
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 (List) and resource (collection rows / series) plus what each row carries (work counts). It doesn't reference any sibling tool, but none of the siblings (search_works, get_work, get_policies, etc.) overlap with listing series, so the purpose is clear enough to distinguish.
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 guidance on when to use this versus search_works or get_work, no prerequisites, and no conditions or exclusions. The agent must infer usage entirely from the name and one-line description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_orderQuote orderARead-onlyInspect
Price a framed print: unit price, subtotal, shipping, and total before tax, with a summary of the store policies. Ships to the US only; tax is calculated by Stripe at checkout.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | size_id from get_print_options, or Small, Medium, Large. Default: the site default (Large when the scan allows) | |
| work | Yes | Prefer ascii_id (the slug) from search_works or get_work; the id with or without its en dash, a /w/ URL, exact title, accession, or NASA ID also work | |
| frame | No | frame_id from get_print_options. Default: the work's default frame | |
| ship_to | No | Optional. Checks that we ship there. | |
| quantity | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish readOnlyHint=true and openWorldHint=false, and the description adds real context on top: the result is a pre-tax estimate, tax is deferred to Stripe at checkout, and shipping is restricted to the US. It stops short of describing failure behavior for unsupported destinations or invalid work identifiers.
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 with no padding, and the price-breakdown scope is front-loaded ahead of the US-shipping and tax caveats. Every clause carries information an agent would otherwise have to infer.
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 usefully enumerates the return values and covers the key constraint (US-only, tax excluded), which is what an agent needs to present a quote. It leaves minor gaps around invalid-input handling and the relationship to create_checkout, but is largely complete for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema already documents size, work, frame, and the nested ship_to fields; the description only reinforces the ship_to constraint with 'Ships to the US only.' It adds no new meaning for work, frame, size, or quantity, which is the expected baseline 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?
The description gives a specific verb ('Price') and resource ('a framed print'), then enumerates exactly what the response contains: unit price, subtotal, shipping, total before tax, plus a policy summary. That distinguishes it functionally from create_checkout, but it never names a sibling, so differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the mention that 'tax is calculated by Stripe at checkout' quietly points toward the checkout flow, and 'Ships to the US only' sets a precondition. There is no explicit statement of when to call this versus create_checkout or get_order_status, and no stated prerequisite on the ordering flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_worksSearch worksARead-onlyInspect
Search works by title, artist, series, NASA ID, or keywords. Returns compact records sorted by PPI.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Search text, for example Bierstadt or Earthrise |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the read-only, closed-world nature is covered. The description usefully adds the return shape ('compact records sorted by PPI'), but 'PPI' is unexplained jargon and there is no mention of pagination or how the limit default/max behave.
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 action and searchable fields, with the return behavior following. No filler or repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter search tool with no output schema, the description gives a rough return contract, which is good. However, the undefined 'PPI' sort key and the silent limit/pagination behavior leave gaps an agent would need to guess at.
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 50%: query is documented in the schema and further enriched by the description's list of searchable fields. The limit parameter has no description in either place, and the description does not disclose the default of 12 or the cap of 25, so it only partially compensates for the coverage gap.
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?
Specific verb (search) plus resource (works) and an enumeration of the searchable fields (title, artist, series, NASA ID, keywords). It is clearly distinct from get_work (single-item fetch) and list_series, though it never names those siblings to make the distinction explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'search works by title, artist, series...' implies when to reach for it (locating works by known attributes), but there is no explicit when-to-use statement, no mention of when to prefer get_work or list_series, and no exclusions.
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.
8 tool updates
- First observed
create_checkout - First observed
get_order_status - First observed
get_policies - First observed
get_print_options - First observed
get_work - First observed
list_series - First observed
quote_order - First observed
search_works
Related MCP Connectors
Search 497,000+ public domain paintings, prints and drawings from 72 museums, with museum records.
51Find artist-credited art prints and canvas, made to order by Image Kind’s studio.
Print existing artwork on custom wall art, apparel, and gifts.
Browse, design and order photo prints for US delivery, with previews, quotes and order tracking.
Related MCP Servers
- AlicenseAqualityBmaintenanceFederated, license-verified search across open-access museum collections — currently The Met, Cleveland, AIC, Wikimedia Commons, and Europeana, with more being added. Strict-default-deny rights gate accepts only CC0 / Public Domain Mark, returning reuse-safe artwork with citations in three styles.5529 npm14MIT
- AlicenseAqualityCmaintenanceEnables searching, browsing and downloading public-domain archival film shots by visual description, with filters for color, aspect ratio and year. It also exposes source films, curated collections, full-film downloads and ffmpeg-trimmed shot ranges saved locally as MP4s.62MIT
- FlicenseNot gradedqualityDmaintenanceProvides access to European cultural heritage collections and artworks, allowing users to search for items, get detailed information about specific artworks, browse collections by institution, and receive AI-powered recommendations based on interests.1-
- AlicenseAqualityFmaintenanceMCP server for searching museum collections and viewing artwork images and metadata from multiple museums, including the Met, Art Institute of Chicago, Rijksmuseum, and more.410 npm2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.