com.pantrypersona/pantry-persona
Pantry Persona
AI-powered kitchen management — pantry, recipes, meal plans, shopping lists
Status
Degraded
Score
80.6
Transport
streamable-http
Tools
20
Production readiness
Verdict
Needs remediation
Current validation evidence shows operational or discovery gaps that should be fixed first.
Critical alerts
1
Production verdicts degrade quickly when critical alerts are active.
Evidence confidence
Confidence score
60.0
Based on 20 recent validations, 26 captured checks, and validation age of 594.1 hours.
Live checks captured
26
More direct checks increase trust in the current verdict.
Validation age
594.1h
Lower age means fresher evidence.
Recommended for
OpenAI connectors
OpenAI connectors is marked compatible with score 100.
Claude Desktop
Claude Desktop is marked compatible with score 100.
Smithery
Smithery is marked compatible with score 100.
Generic Streamable HTTP
Generic Streamable HTTP is marked compatible with score 100.
Client readiness verdicts
Ready for ChatGPT custom connector
Ready
No major blockers detected.
Confidence: medium (60.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history, server_card
Disagreements: none
initialize• Auth Requiredtools_list• OKtransport_compliance_probe• Warningstep_up_auth_probe• OKconnector_replay_probe• OK — Frozen tool snapshots must survive refresh.request_association_probe• Missing — Roots, sampling, and elicitation should stay request-scoped.
Ready for Claude remote MCP
Ready
No major blockers detected.
Confidence: medium (60.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history, server_card
Disagreements: none
initialize• Auth Requiredtools_list• OKtransport_compliance_probe• Warning
Unsafe for write actions
No
Current write surface is bounded enough for cautious review.
Confidence: medium (60.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history
Disagreements: none
action_safety_probe• Warning
Snapshot churn risk
Low
No material tool-surface churn detected in the latest comparison.
Confidence: medium (60.0)
Evidence provenance
Winner: history
Supporting sources: history, live_validation
Disagreements: none
tool_snapshot_probe• OKconnector_replay_probe• OK
Why not ready by client
ChatGPT custom connector
Ready
Remediation checklist
- No explicit blockers recorded.
Claude remote MCP
Ready
Remediation checklist
- No explicit blockers recorded.
Write-safe publishing
Ready
Remediation checklist
- No explicit blockers recorded.
Verdict traces
Production verdict
Needs remediation
Current validation evidence shows operational or discovery gaps that should be fixed first.
Confidence: medium (60.0)
Winning source: live_validation
Triggering alerts
validation_stale• medium • Validation evidence is staleserver_degraded• medium • Latest validation is degradedwrite_action_surface_expanded• high • Write-action surface expanded
Client verdict trace table
| Verdict | Status | Checks | Winning source | Conflicts |
|---|---|---|---|---|
openai_connectors |
Ready | initialize, tools_list, transport_compliance_probe, step_up_auth_probe, connector_replay_probe, request_association_probe | live_validation | none |
claude_desktop |
Ready | initialize, tools_list, transport_compliance_probe | live_validation | none |
unsafe_for_write_actions |
No | action_safety_probe | live_validation | none |
snapshot_churn_risk |
Low | tool_snapshot_probe, connector_replay_probe | history | none |
Publishability policy profiles
ChatGPT custom connector publishability
Ready
Remote MCP, auth, transport, and tool-surface checks are in acceptable shape.
- Search Fetch Only: No
- Write Actions Present: Yes
- Oauth Configured: Yes
- Admin Refresh Required: No
- Safe For Company Knowledge: No
- Safe For Messages Api Remote Mcp: No
Claude remote MCP publishability
Ready
Transport, discovery, and remote-MCP assumptions are satisfied.
- Search Fetch Only: No
- Write Actions Present: Yes
- Oauth Configured: Yes
- Admin Refresh Required: No
- Safe For Company Knowledge: No
- Safe For Messages Api Remote Mcp: No
Compatibility fixtures
ChatGPT custom connector fixture
Passes
Live checks line up with current ChatGPT connector assumptions.
- remote_http_endpoint: Passes
- oauth_discovery: Passes
- frozen_tool_snapshot_refresh: Passes
- request_association: Passes
Anthropic remote MCP fixture
Passes
Remote MCP transport and discovery assumptions are satisfied.
- remote_transport: Passes
- tool_discovery: Passes
- auth_connect: Passes
- safe_write_review: Passes
Authenticated validation sessions
Latest profile
remote_mcp
Authenticated session used
Public score isolation
Preview endpoint
/v1/verifyCI preview endpoint
/v1/ci/previewPublic server reputation
Validation success 7d
n/a
Validation success 30d
0.0
Mean time to recover
n/a
Breaking diffs 30d
4
Registry drift frequency 30d
0
Snapshot changes 30d
2
Incident & change feed
| Timestamp | Event | Details |
|---|---|---|
| Apr 09, 2026 09:08:21 AM UTC | Latest validation: degraded | Score 80.6 with status degraded. |
| Apr 09, 2026 01:07:54 AM UTC | Score changed | Score delta -0.5 versus the previous run. |
Capabilities
- OAuth:
- DCR/CIMD:
- Prompts:
- Homepage: https://www.pantrypersona.com
- Docs: none
- Support: none
- Icon: none
- Remote endpoint: https://www.pantrypersona.com/api/mcp
- Server card: none
Use-case taxonomy
development database search communication
Security posture
Tools analyzed
20
High-risk tools
11
Destructive tools
8
Exec tools
4
Egress tools
1
Secret tools
2
Bulk-access tools
6
Risk distribution
medium:9, high:8, critical:3
Tool capability & risk inventory
| Tool | Capabilities | Risk | Findings | Notes |
|---|---|---|---|---|
manage_shopping |
read write delete filesystem admin export | Critical | destructive operation bulk data access filesystem mutation admin mutation | No explicit safeguard hints detected. |
manage_pantry |
read write delete admin | High | destructive operation admin mutation | No explicit safeguard hints detected. |
manage_meal_plan |
read write delete filesystem admin | High | destructive operation filesystem mutation admin mutation | No explicit safeguard hints detected. |
find_recipes |
read write filesystem admin | Medium | filesystem mutation admin mutation | No explicit safeguard hints detected. |
get_pantry |
read admin | Medium | none | No explicit safeguard hints detected. |
manage_recipes |
read write delete exec network admin | Critical | destructive operation command execution arbitrary network egress freeform input surface admin mutation | No explicit safeguard hints detected. |
shop_for_meal_plan |
read write admin | Medium | admin mutation | No explicit safeguard hints detected. |
post_cook |
read write delete admin secrets | High | destructive operation secret material access admin mutation | No explicit safeguard hints detected. |
process_receipt |
read filesystem admin | Medium | none | No explicit safeguard hints detected. |
get_insights |
read exec admin export | High | command execution bulk data access | No explicit safeguard hints detected. |
manage_profiles |
read write delete exec filesystem admin secrets | Critical | destructive operation command execution secret material access filesystem mutation admin mutation | Safeguards hinted in metadata. |
manage_collections |
read write delete admin | High | destructive operation admin mutation | No explicit safeguard hints detected. |
manage_preferences |
read write filesystem admin export | Medium | bulk data access filesystem mutation admin mutation | Safeguards hinted in metadata. |
get_user_context |
read write filesystem admin export | High | bulk data access filesystem mutation admin mutation | No explicit safeguard hints detected. |
show_shopping |
read write delete admin export | High | destructive operation bulk data access admin mutation | No explicit safeguard hints detected. |
show_pantry |
read write network admin | Medium | admin mutation | Safeguards hinted in metadata. |
show_recipes |
read write exec admin export | High | command execution bulk data access freeform input surface admin mutation | Safeguards hinted in metadata. |
show_meal_plan |
read admin | Medium | none | Safeguards hinted in metadata. |
show_profiles |
read write filesystem admin | Medium | filesystem mutation admin mutation | No explicit safeguard hints detected. |
get_next_steps |
read filesystem admin | Medium | none | No explicit safeguard hints detected. |
Write-action governance
Governance status
Warning
Safe to publish
Auth boundary
oauth_or_auth_required
Blast radius
High
High-risk tools
11
Confirmation signals
show_pantry, show_meal_plan
Safeguard count
5
Status detail: 11 high-risk tool(s), 8 destructive tool(s), 4 exec-capable tool(s); auth boundary is oauth or auth required with 5 safeguard(s) and 2 confirmation signal(s).
| Tool | Risk | Flags | Safeguards |
|---|---|---|---|
manage_shopping |
Critical | destructive operation bulk data access filesystem mutation admin mutation | no |
manage_pantry |
High | destructive operation admin mutation | no |
manage_meal_plan |
High | destructive operation filesystem mutation admin mutation | no |
manage_recipes |
Critical | destructive operation command execution arbitrary network egress freeform input surface admin mutation | no |
post_cook |
High | destructive operation secret material access admin mutation | no |
get_insights |
High | command execution bulk data access | no |
manage_profiles |
Critical | destructive operation command execution secret material access filesystem mutation admin mutation | yes |
manage_collections |
High | destructive operation admin mutation | no |
get_user_context |
High | bulk data access filesystem mutation admin mutation | no |
show_shopping |
High | destructive operation bulk data access admin mutation | no |
show_recipes |
High | command execution bulk data access freeform input surface admin mutation | yes |
Action-controls diff
Snapshot changed
no
Disabled-by-default candidates
none
Manual review candidates
none
New actions
| Action | Risk | Flags |
|---|---|---|
| No newly added actions. | ||
Changed actions
| Action | Change types | Risk |
|---|---|---|
| No materially changed actions. | ||
Why this score?
Access & Protocol
37/44
Connectivity, auth, and transport expectations for common clients.
Interface Quality
44.5/56
How well the tool/resource interface communicates and behaves under automation.
Security Posture
27/36
How safely the exposed tool surface handles destructive actions, egress, execution, secrets, and risky inputs.
Reliability & Trust
21/24
Operational stability, consistency, and trustworthiness over time.
Discovery & Governance
22.5/28
How well the server is documented, listed, and governed in public registries.
Adoption & Market
6/8
Adoption clues and public evidence that the server is intended for external use.
Algorithmic score breakdown
Auth Operability
4/4
Measures whether auth discovery and protected access behave predictably for clients.
Error Contract Quality
3/4
Grades machine-readable error structure, status alignment, and remediation hints.
Rate-Limit Semantics
2/4
Checks whether quota/throttle responses are deterministic and automation-friendly.
Schema Completeness
3/4
Completeness of tool descriptions, parameter docs, examples, and schema shape.
Backward Compatibility
3/4
Stability score across tool schema/name drift relative to prior validations.
SLO Health
3/4
Availability, latency, and burst-failure profile across recent validation history.
Security Hygiene
4/4
HTTPS posture, endpoint hygiene, and response-surface hardening checks.
Task Success
4/4
Can an agent reliably initialize, enumerate tools, and execute core MCP flows?
Trust Confidence
4/4
Confidence-adjusted reliability score that penalizes low evidence volume.
Abuse/Noise Resilience
3/4
How well the server preserves core behavior in the presence of noisy traffic patterns.
Prompt Contract
3/4
Quality of prompt metadata, argument shape, and prompt discoverability for clients.
Resource Contract
4/4
How completely resources and resource templates describe URIs, types, and usage shape.
Discovery Metadata
2/4
Homepage, docs, icon, repository, support, and license coverage for directory consumers.
Registry Consistency
3/4
Agreement between stored registry metadata, live server-card data, and current validation output.
Installability
4/4
How cleanly a real client can connect, initialize, enumerate tools, and proceed through auth.
Session Semantics
4/4
Determinism and state behavior across repeated MCP calls, including sticky-session surprises.
Tool Surface Design
3/4
Naming clarity, schema ergonomics, and parameter complexity across the tool surface.
Result Shape Stability
3/4
Stability of declared output schemas across validations, with penalties for drift or missing shapes.
OAuth Interop
4/4
Depth and client compatibility of OAuth/OIDC metadata beyond the minimal protected-resource check.
Recovery Semantics
2.5/4
Whether failures include actionable machine-readable next steps such as retry or upgrade guidance.
Maintenance Signal
3/4
Versioning, update recency, and historical validation cadence that indicate active stewardship.
Adoption Signal
3/4
Directory presence and distribution clues that suggest the server is intended for external use.
Freshness Confidence
4/4
Confidence that recent validations are current enough and dense enough to trust operationally.
Transport Fidelity
4/4
Whether declared transport metadata matches the observed endpoint behavior and response formats.
Spec Recency
2/4
How close the server’s claimed MCP protocol version is to the latest known public revision.
Session Resume
3/4
Whether Streamable HTTP session identifiers and resumed requests behave cleanly for real clients.
Step-Up Auth
4/4
Whether OAuth metadata and WWW-Authenticate challenges support granular, incremental consent instead of broad upfront scopes.
Transport Compliance
2/4
Checks session headers, protocol-version enforcement, session teardown, and expired-session behavior.
Utility Coverage
2/4
Signals support for completions, pagination, and task-oriented utility surfaces that larger clients increasingly expect.
Advanced Capability Coverage
3/4
Coverage of newer MCP surfaces like roots, sampling, elicitation, structured output, and related metadata.
Connector Publishability
3/4
How ready the server looks for client catalogs and managed connector programs.
Tool Snapshot Churn
4/4
Stability of the tool surface across recent validations, including add/remove and output-shape drift.
Connector Replay
4/4
Whether a previously published frozen connector snapshot would remain backward compatible after the latest tool refresh.
Request Association
3/4
Whether roots, sampling, and elicitation appear tied to active client requests instead of arriving unsolicited on idle sessions.
Interactive Flow Safety
4/4
Whether prompts and docs steer users toward safe auth flows instead of pasting secrets directly.
Action Safety
2/4
Risk-weighted view of destructive, exec, egress, and confirmation semantics across the tool surface.
Official Registry Presence
4/4
Whether the server appears directly or indirectly in the official MCP registry.
Provenance Divergence
4/4
How closely official registry metadata, the live server card, and public repo/package signals agree with each other.
Safety Transparency
3/4
Clarity of docs, auth disclosure, support links, and other trust signals visible to integrators.
Tool Capability Clarity
4/4
How clearly the tool surface communicates whether each action reads, writes, deletes, executes, or exports data.
Destructive Operation Safety
3/4
Penalizes delete/revoke/destroy style tools unless auth and safeguards reduce blast radius.
Egress / SSRF Resilience
4/4
Assesses arbitrary URL fetch, crawl, webhook, and remote-request exposure on the tool surface.
Execution / Sandbox Safety
2/4
Evaluates shell, code, script, and command-execution exposure and whether that surface appears contained.
Data Exfiltration Resilience
2/4
Assesses export, dump, backup, and bulk-read behavior against the surrounding auth and safeguard signals.
Least Privilege Scope
3/4
Rewards scoped auth metadata and penalizes broad or missing scopes around privileged tools.
Secret Handling Hygiene
3/4
Assesses secret-bearing tools, token leakage risk, and whether the public surface avoids obvious secret exposure.
Supply Chain Signal
3.5/4
Public metadata signal for repository, changelog, license, versioning, and recency that supports supply-chain trust.
Input Sanitization Safety
3/4
Penalizes risky freeform string inputs when schemas do not constrain URLs, code, paths, queries, or templates.
Tool Namespace Clarity
4/4
Measures naming uniqueness and ambiguity across the tool namespace to reduce collision and confusion risk.
Compatibility profiles
OpenAI Connectors
100.0
compatible
No major blockers detected.
Connector URL: https://www.pantrypersona.com/api/mcp # Complete OAuth in the client when prompted. # Server: com.pantrypersona/pantry-persona
Claude Desktop
100.0
compatible
No major blockers detected.
{
"mcpServers": {
"pantry-persona": {
"command": "npx",
"args": ["mcp-remote", "https://www.pantrypersona.com/api/mcp"]
}
}
}
Smithery
100.0
compatible
No major blockers detected.
smithery mcp add "https://www.pantrypersona.com/api/mcp"
Generic Streamable HTTP
100.0
compatible
No major blockers detected.
curl -sS https://www.pantrypersona.com/api/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-verify","version":"0.1.0"}}}'
Actionable remediation
| Severity | Remediation | Why it matters | Recommended action |
|---|---|---|---|
| Critical | Make initialize deterministic and client-friendly | If initialize fails or requires undocumented auth, many MCP clients cannot connect. | Allow initialize to succeed consistently, or return a deterministic auth-required response with clear metadata.Playbook
|
| High | Add confirmation and dry-run semantics for risky actions | High-risk write, delete, exec, or egress tools should communicate safeguards clearly. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| High | Align session and protocol behavior with Streamable HTTP expectations | Clients increasingly rely on MCP-Protocol-Version, session teardown, and expired-session semantics. | Align MCP-Protocol-Version, MCP-Session-Id, DELETE teardown, and expired-session handling with the transport spec.Playbook
|
| High | Associate roots, sampling, and elicitation with active client requests | Modern MCP guidance expects roots, sampling, and elicitation traffic to be tied to an active client request instead of arriving unsolicited on idle sessions. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| High | Respond to write-action surface expanded | The number of high-risk write, delete, exec, or bulk-access tools increased on the latest run. | Review the newly exposed write and destructive actions before publishing them broadly.Playbook
|
| Medium | Adopt a current MCP protocol revision | Older protocol revisions reduce compatibility with newer clients and registry programs. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| Medium | Close connector-publishing gaps | Connector catalogs care about protocol recency, session behavior, auth clarity, and tool-surface stability. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| Medium | Respond to latest validation is degraded | The server is reachable but at least one important behavior regressed. | Resolve the regressed checks and review the latest validation diff.Playbook
|
| Medium | Respond to validation evidence is stale | Latest validation is 594.1 hours old. | Trigger a fresh validation run or increase scheduler priority for this server.Playbook
|
| Medium | Support resumable HTTP sessions cleanly | Modern MCP clients increasingly expect resumable session behavior on streamable HTTP transports. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| Low | Publish newer MCP capability signals | Roots, sampling, elicitation, structured outputs, and related metadata improve client understanding and ranking. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
Point loss breakdown
| Component | Current | Points missing |
|---|---|---|
| Utility Coverage | 2/4 | -2.0 |
| Transport Compliance | 2/4 | -2.0 |
| Spec Recency | 2/4 | -2.0 |
| Rate Limit Semantics | 2/4 | -2.0 |
| Execution Sandbox Safety | 2/4 | -2.0 |
| Discovery Metadata | 2/4 | -2.0 |
| Data Exfiltration Resilience | 2/4 | -2.0 |
| Action Safety | 2/4 | -2.0 |
| Recovery Semantics | 2.5/4 | -1.5 |
| Tool Surface Design | 3/4 | -1.0 |
| SLO Health | 3/4 | -1.0 |
| Session Resume | 3/4 | -1.0 |
Validation diff
Score delta
0
Summary changed
no
Tool delta
0
Prompt delta
0
Auth mode changed
no
Write surface expanded
yes
Protocol regressed
no
Registry drift changed
no
Regressed checks: none
Improved checks: none
| Component | Previous | Latest | Delta |
|---|---|---|---|
| No component deltas between the latest two runs. | |||
Tool snapshot diff & changelog
Snapshot changed
no
Added tools
none
Removed tools
none
Required-argument changes
| Tool | Added required args | Removed required args |
|---|---|---|
| No required-argument changes detected. | ||
Output-schema drift
| Tool | Previous properties | Latest properties |
|---|---|---|
| No output-schema drift detected. | ||
Connector replay
Status
OK
Backward compatible
Would break after refresh
Added tools
none
Removed tools
none
Additive output changes
none
Required-argument replay breaks
| Tool | Added required args | Removed required args |
|---|---|---|
| No required-argument replay breaks detected. | ||
Output-schema replay breaks
| Tool | Removed properties | Added properties |
|---|---|---|
| No output-schema replay breaks detected. | ||
Transport compliance drilldown
Probe status
Warning
Transport
streamable-http
Session header
no
Protocol header
no
Bad protocol response
400
DELETE teardown
n/a
Expired session retry
n/a
Last-Event-ID visible
no
Issues: missing_protocol_header
Request association
Status
Missing
Advertised capabilities
none
Observed idle methods
none
Violating methods
none
Probe HTTP status
n/a
Issues
none
Utility coverage
Probe status
OK
Completions
not detected
Completion probe target: {
"argument_name": "startDay",
"name": "plan_weekly_meals",
"type": "prompt"
}
Pagination
not detected
No nextCursor evidence.
Tasks
Auth Required
Advertised: no
Benchmark tasks
| Benchmark task | Status | Evidence |
|---|---|---|
| Discover tools | Passes |
|
| Read-only fetch flow | Degraded |
|
| OAuth-required connect | Passes |
|
| Safe write flow with confirmation | Degraded |
|
Registry & provenance divergence
Probe status
OK
Direct official match
yes
Drift fields
none
| Field | Registry | Live server card |
|---|---|---|
| Title | n/a | pantry-persona |
| Version | n/a | 1.0.0 |
| Homepage | n/a | n/a |
Active alerts
- Validation evidence is stale (medium)
Latest validation is 594.1 hours old. - Latest validation is degraded (medium)
The server is reachable but at least one important behavior regressed. - Write-action surface expanded (high)
The number of high-risk write, delete, exec, or bulk-access tools increased on the latest run.
Aliases & registry graph
| Identifier | Source | Canonical | Score |
|---|---|---|---|
com.pantrypersona/pantry-persona |
official_registry | yes | 80.61 |
Alias consolidation
Canonical identifier
com.pantrypersona/pantry-persona
Duplicate aliases
0
Registry sources
official_registry
Remote URLs
Homepages
Source disagreements
| Field | What differs | Observed values |
|---|---|---|
| No source disagreements detected. | ||
Install snippets
Openai Connectors
Connector URL: https://www.pantrypersona.com/api/mcp # Complete OAuth in the client when prompted. # Server: com.pantrypersona/pantry-persona
Claude Desktop
{
"mcpServers": {
"pantry-persona": {
"command": "npx",
"args": ["mcp-remote", "https://www.pantrypersona.com/api/mcp"]
}
}
}
Smithery
smithery mcp add "https://www.pantrypersona.com/api/mcp"
Generic Http
curl -sS https://www.pantrypersona.com/api/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-verify","version":"0.1.0"}}}'
Agent access & tool surface
Live server tools
manage_shopping manage_pantry manage_meal_plan find_recipes get_pantry manage_recipes shop_for_meal_plan post_cook
Observed from the latest live validation against https://www.pantrypersona.com/api/mcp. This is the target server surface, not Verify's own inspection tools.
Live capability counts
20 tools • 11 prompts • 6 resources
Counts come from the latest
tools/list, prompts/list, and resources/list checks.Inspect with Verify
search_servers recommend_servers get_server_report compare_servers
Use Verify itself to search, recommend, compare, and fetch the full report for
com.pantrypersona/pantry-persona.Direct machine links
Claims & monitoring
Server ownership
No verified maintainer claim recorded.
Watch subscriptions
0
Teams: none
Alert routing
Active watches
0
Generic webhooks
0
Slack routes
0
Teams routes
0
Email routes
0
| Watch | Team | Channels | Minimum severity |
|---|---|---|---|
| No active watch destinations. | |||
Maintainer analytics
Validation Run Count
20
Average Latency Ms
3053.98
Healthy Run Ratio Recent
0.0
Registry Presence Count
1
Active Alert Count
3
Watcher Count
0
Verified Claim
False
Taxonomy Tags
development, database, search, communication
Score Trend
80.61, 80.61, 81.12, 81.12, 80.1, 78.64, 81.12, 80.61, 81.12, 81.12
Remediation Count
11
High Risk Tool Count
11
Destructive Tool Count
8
Exec Tool Count
4
Maintainer response quality
Score
16.67
Verified claim
Support contact
Changelog present
Incident notes present
Tool changes documented
Annotation history
Annotation count
0
Maintainer annotations
No maintainer annotations have been recorded yet.
Maintainer rebuttals & expected behavior
No maintainer rebuttals or expected-behavior overrides are recorded yet.
Latest validation evidence
Latest summary
Degraded
Validation profile
remote_mcp
Started
Apr 09, 2026 09:08:19 AM UTC
Latency
1695.7 ms
Failures
initializeClient error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401prompt_getClient error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401resource_readClient error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401
Checks
| Check | Status | Latency | Evidence |
|---|---|---|---|
action_safety_probe |
Warning | n/a | 11 high-risk, 8 destructive, 4 exec-capable tool(s); auth present; safeguards=5; confirmation=show pantry, show meal plan. |
advanced_capabilities_probe |
Warning | n/a | Only 3 capability signal(s): prompts, resource links, resources. |
connector_publishability_probe |
Warning | n/a | Publishability blockers: protocol version. |
connector_replay_probe |
OK | n/a | Backward compatible with no breaking tool-surface changes. |
determinism_probe |
OK | 109.5 ms | Check completed |
initialize |
Auth Required | 64.1 ms | Client error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401 |
interactive_flow_probe |
OK | n/a | Check completed |
oauth_authorization_server |
OK | 167.5 ms | authorization_endpoint, claims_supported, code_challenge_methods_supported, grant_types_supported |
oauth_protected_resource |
OK | 168.3 ms | 1 authorization server(s) |
official_registry_probe |
OK | n/a | Check completed |
openid_configuration |
OK | 138.6 ms | authorization_endpoint, code_challenge_methods_supported, grant_types_supported, issuer |
probe_noise_resilience |
OK | 21.9 ms | Fetched https://www.pantrypersona.com/robots.txt |
prompt_get |
Auth Required | 19.8 ms | Client error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401 |
prompts_list |
OK | 182.1 ms | 11 prompt(s) exposed |
protocol_version_probe |
Missing | n/a | No protocol version was advertised. |
provenance_divergence_probe |
OK | n/a | Check completed |
request_association_probe |
Missing | n/a | No request-association capabilities were advertised. |
resource_read |
Auth Required | 15.9 ms | Client error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401 |
resources_list |
OK | 50.9 ms | 6 resource item(s) exposed |
server_card |
OK | 122.5 ms | 1 prompt(s) exposed |
session_resume_probe |
Missing | n/a | no session id |
step_up_auth_probe |
OK | n/a | Scopes=meal-plans:read, meal-plans:write, pantry:read, pantry:write, +5 more; broad scopes=meal-plans:write, pantry:write, recipes:write, shopping:write; step-up challenge hints present. |
tool_snapshot_probe |
OK | n/a | Check completed |
tools_list |
OK | 191.8 ms | 20 tool(s) exposed |
transport_compliance_probe |
Warning | 50.9 ms | Issues: missing protocol header (bad protocol=400). |
utility_coverage_probe |
OK | 17.7 ms | No completions evidence; no pagination evidence; tasks auth required. |
Raw evidence view
Show raw JSON evidence
{
"checks": {
"action_safety_probe": {
"details": {
"auth_present": true,
"confirmation_signals": [
"show_pantry",
"show_meal_plan"
],
"safeguard_count": 5,
"summary": {
"bulk_access_tools": 6,
"capability_distribution": {
"admin": 20,
"delete": 8,
"exec": 4,
"export": 6,
"filesystem": 9,
"network": 2,
"read": 20,
"secrets": 2,
"write": 15
},
"destructive_tools": 8,
"egress_tools": 1,
"exec_tools": 4,
"high_risk_tools": 11,
"risk_distribution": {
"critical": 3,
"high": 8,
"low": 0,
"medium": 9
},
"secret_tools": 2,
"tool_count": 20
}
},
"latency_ms": null,
"status": "warning"
},
"advanced_capabilities_probe": {
"details": {
"capabilities": {
"completions": false,
"elicitation": false,
"prompts": true,
"resource_links": true,
"resources": true,
"roots": false,
"sampling": false,
"structured_outputs": false
},
"enabled": [
"prompts",
"resource_links",
"resources"
],
"enabled_count": 3,
"initialize_capability_keys": []
},
"latency_ms": null,
"status": "warning"
},
"connector_publishability_probe": {
"details": {
"blockers": [
"protocol_version"
],
"criteria": {
"action_safety": true,
"auth_flow": true,
"connector_replay": true,
"initialize": true,
"protocol_version": false,
"remote_transport": true,
"request_association": true,
"server_card": true,
"session_resume": true,
"step_up_auth": true,
"tool_surface": true,
"tools_list": true,
"transport_compliance": true
},
"high_risk_tools": 11,
"tool_count": 20,
"transport": "streamable-http"
},
"latency_ms": null,
"status": "warning"
},
"connector_replay_probe": {
"details": {
"added_tools": [],
"additive_output_changes": [],
"backward_compatible": true,
"output_breaks": [],
"removed_tools": [],
"required_arg_breaks": [],
"would_break_after_refresh": false
},
"latency_ms": null,
"status": "ok"
},
"determinism_probe": {
"details": {
"attempts": 2,
"baseline_signature": "ac17b3f4ff642627206612fe2b819e814266f1ae5b92a27df3ef740b14115bde",
"errors": [],
"matches": 2,
"stable_ratio": 1.0,
"successful": 2
},
"latency_ms": 109.53,
"status": "ok"
},
"initialize": {
"details": {
"error": "Client error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401",
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload",
"www-authenticate": "Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\""
},
"http_status": 401,
"payload": {},
"url": "https://www.pantrypersona.com/api/mcp"
},
"latency_ms": 64.1,
"status": "auth_required"
},
"interactive_flow_probe": {
"details": {
"oauth_supported": true,
"prompt_available": false,
"risk_hits": [],
"safe_hits": [
"oauth"
]
},
"latency_ms": null,
"status": "ok"
},
"oauth_authorization_server": {
"details": {
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload"
},
"http_status": 200,
"payload": {
"authorization_endpoint": "https://www.pantrypersona.com/api/oauth/authorize",
"claims_supported": [
"sub",
"aud",
"exp",
"iat",
"iss",
"scope"
],
"code_challenge_methods_supported": [
"S256"
],
"grant_types_supported": [
"authorization_code",
"refresh_token"
],
"issuer": "https://www.pantrypersona.com",
"registration_endpoint": "https://www.pantrypersona.com/api/oauth/register",
"response_modes_supported": [
"query"
],
"response_types_supported": [
"code"
],
"scopes_supported": [
"pantry:read",
"pantry:write",
"recipes:read",
"recipes:write",
"meal-plans:read",
"meal-plans:write",
"profile:read",
"shopping:read",
"shopping:write"
],
"service_documentation": "https://www.pantrypersona.com/docs",
"token_endpoint": "https://www.pantrypersona.com/api/oauth/token",
"token_endpoint_auth_methods_supported": [
"client_secret_post",
"client_secret_basic",
"none"
],
"ui_locales_supported": [
"en"
]
},
"url": "https://www.pantrypersona.com/.well-known/oauth-authorization-server"
},
"latency_ms": 167.5,
"status": "ok"
},
"oauth_protected_resource": {
"details": {
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload"
},
"http_status": 200,
"payload": {
"authorization_servers": [
"https://www.pantrypersona.com"
],
"bearer_methods_supported": [
"header"
],
"resource": "https://www.pantrypersona.com",
"resource_documentation": "https://www.pantrypersona.com/docs",
"scopes_supported": [
"pantry:read",
"pantry:write",
"recipes:read",
"recipes:write",
"meal-plans:read",
"meal-plans:write",
"profile:read",
"shopping:read",
"shopping:write",
"chronicle:read"
]
},
"url": "https://www.pantrypersona.com/.well-known/oauth-protected-resource"
},
"latency_ms": 168.32,
"status": "ok"
},
"official_registry_probe": {
"details": {
"direct_match": true,
"official_peer_count": 1,
"registry_identifier": "com.pantrypersona/pantry-persona",
"registry_source": "official_registry"
},
"latency_ms": null,
"status": "ok"
},
"openid_configuration": {
"details": {
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload"
},
"http_status": 200,
"payload": {
"authorization_endpoint": "https://www.pantrypersona.com/api/oauth/authorize",
"code_challenge_methods_supported": [
"S256"
],
"grant_types_supported": [
"authorization_code",
"refresh_token"
],
"issuer": "https://www.pantrypersona.com",
"registration_endpoint": "https://www.pantrypersona.com/api/oauth/register",
"response_modes_supported": [
"query"
],
"response_types_supported": [
"code"
],
"scopes_supported": [
"pantry:read",
"pantry:write",
"recipes:read",
"recipes:write",
"meal-plans:read",
"meal-plans:write",
"profile:read",
"shopping:read",
"shopping:write"
],
"service_documentation": "https://www.pantrypersona.com/docs",
"token_endpoint": "https://www.pantrypersona.com/api/oauth/token",
"token_endpoint_auth_methods_supported": [
"client_secret_post",
"client_secret_basic",
"none"
],
"ui_locales_supported": [
"en"
]
},
"url": "https://www.pantrypersona.com/.well-known/openid-configuration"
},
"latency_ms": 138.6,
"status": "ok"
},
"probe_noise_resilience": {
"details": {
"headers": {
"content-type": "text/plain; charset=utf-8",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload"
},
"http_status": 200,
"url": "https://www.pantrypersona.com/robots.txt"
},
"latency_ms": 21.88,
"status": "ok"
},
"prompt_get": {
"details": {
"error": "Client error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401",
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload",
"www-authenticate": "Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\""
},
"http_status": 401,
"payload": {},
"prompt_arguments": [
{
"description": "Which day to start the week on",
"name": "startDay",
"required": false
}
],
"prompt_name": "plan_weekly_meals",
"reason": "auth_required",
"url": "https://www.pantrypersona.com/api/mcp"
},
"latency_ms": 19.82,
"status": "auth_required"
},
"prompts_list": {
"details": {
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload"
},
"http_status": 200,
"payload": {
"id": 3,
"jsonrpc": "2.0",
"result": {
"prompts": [
{
"arguments": [
{
"description": "Which day to start the week on",
"name": "startDay",
"required": false
}
],
"description": "Generate a personalized weekly meal plan based on your pantry, preferences, and dietary needs.",
"name": "plan_weekly_meals",
"title": "Plan Weekly Meals"
},
{
"description": "Find recipes you can make right now with ingredients already in your pantry.",
"name": "whats_for_dinner",
"title": "What's for Dinner?"
},
{
"arguments": [
{
"description": "Target store name to add items to",
"name": "store",
"required": false
}
],
"description": "Build a shopping list from your meal plan, automatically excluding items already in your pantry.",
"name": "generate_shopping_list",
"title": "Generate Shopping List"
},
{
"description": "Review your pantry for expiring items, low stock, and restock suggestions.",
"name": "pantry_check",
"title": "Pantry Check"
},
{
"arguments": [
{
"description": "The recipe URL to import",
"name": "url",
"required": true
}
],
"description": "Import and save a recipe from any website URL.",
"name": "save_recipe_from_url",
"title": "Save Recipe from URL"
},
{
"arguments": [
{
"description": "How many days ahead to predict (default: 14)",
"name": "daysAhead",
"required": false
}
],
"description": "Check which items you need to restock based on your purchase history and consumption patterns.",
"name": "restock_check",
"title": "What Should I Restock?"
},
{
"arguments": [
{
"description": "Time period for the report (default: month)",
"name": "period",
"required": false
}
],
"description": "Get a breakdown of your grocery spending by store, category, and trends.",
"name": "spending_report",
"title": "My Spending Report"
},
{
"description": "Discover your shopping habits \u2014 most-bought items, preferred stores, and buying frequency.",
"name": "shopping_patterns",
"title": "My Shopping Patterns"
},
{
"arguments": [
{
"description": "Maximum total cook time in minutes (default: 30)",
"name": "maxMinutes",
"required": false
}
],
"description": "Find quick recipes you can make tonight with what you have on hand.",
"name": "quick_dinner",
"title": "Quick Dinner Ideas"
},
{
"arguments": [
{
"description": "Weekly grocery budget (e.g., \"$75\", \"$100\")",
"name": "budget",
"required": false
}
],
"description": "Plan affordable meals for the week based on your budget and spending history.",
"name": "weekly_budget_meals",
"title": "Budget Meal Planning"
},
{
"description": "Get a comprehensive overview of your kitchen \u2014 pantry inventory, expiring items, restock needs, and meal plan status.",
"name": "kitchen_status",
"title": "Full Kitchen Status"
}
]
}
},
"url": "https://www.pantrypersona.com/api/mcp"
},
"latency_ms": 182.06,
"status": "ok"
},
"protocol_version_probe": {
"details": {
"latest_known_version": "2025-11-25",
"reason": "no_protocol_version",
"validator_protocol_version": "2025-03-26"
},
"latency_ms": null,
"status": "missing"
},
"provenance_divergence_probe": {
"details": {
"direct_official_match": true,
"drift_fields": [],
"metadata_document_count": 3,
"registry_homepage": null,
"registry_repository": null,
"registry_title": null,
"registry_version": null,
"server_card_homepage": null,
"server_card_repository": null,
"server_card_title": "pantry-persona",
"server_card_version": "1.0.0"
},
"latency_ms": null,
"status": "ok"
},
"request_association_probe": {
"details": {
"reason": "no_request_association_capabilities_advertised"
},
"latency_ms": null,
"status": "missing"
},
"resource_read": {
"details": {
"error": "Client error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401",
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload",
"www-authenticate": "Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\""
},
"http_status": 401,
"payload": {},
"reason": "auth_required",
"resource_uri": "ui://widget/Pantry.html",
"url": "https://www.pantrypersona.com/api/mcp"
},
"latency_ms": 15.88,
"status": "auth_required"
},
"resources_list": {
"details": {
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload"
},
"http_status": 200,
"payload": {
"id": 5,
"jsonrpc": "2.0",
"result": {
"resources": [
{
"_meta": {
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "View and manage pantry inventory with expiration tracking",
"openai/widgetDomain": "https://www.pantrypersona.com",
"openai/widgetPrefersBorder": true,
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"domain": "bb64a469f82c9e3b07a766d814b7e882.claudemcpcontent.com"
}
},
"description": "View and manage pantry inventory with expiration tracking",
"mimeType": "text/html;profile=mcp-app",
"name": "Pantry",
"uri": "ui://widget/Pantry.html"
},
{
"_meta": {
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "Manage household profiles and dietary preferences",
"openai/widgetDomain": "https://www.pantrypersona.com",
"openai/widgetPrefersBorder": true,
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"domain": "bb64a469f82c9e3b07a766d814b7e882.claudemcpcontent.com"
}
},
"description": "Manage household profiles and dietary preferences",
"mimeType": "text/html;profile=mcp-app",
"name": "Profiles",
"uri": "ui://widget/Profiles.html"
},
{
"_meta": {
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "Browse saved recipes with filtering and search",
"openai/widgetDomain": "https://www.pantrypersona.com",
"openai/widgetPrefersBorder": true,
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"domain": "bb64a469f82c9e3b07a766d814b7e882.claudemcpcontent.com"
}
},
"description": "Browse saved recipes with filtering and search",
"mimeType": "text/html;profile=mcp-app",
"name": "Recipes",
"uri": "ui://widget/Recipes.html"
},
{
"_meta": {
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "Weekly meal planning calendar with drag-and-drop",
"openai/widgetDomain": "https://www.pantrypersona.com",
"openai/widgetPrefersBorder": true,
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"domain": "bb64a469f82c9e3b07a766d814b7e882.claudemcpcontent.com"
}
},
"description": "Weekly meal planning calendar with drag-and-drop",
"mimeType": "text/html;profile=mcp-app",
"name": "MealPlan",
"uri": "ui://widget/MealPlan.html"
},
{
"_meta": {
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "Interactive shopping list with swipe-to-check",
"openai/widgetDomain": "https://www.pantrypersona.com",
"openai/widgetPrefersBorder": true,
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"domain": "bb64a469f82c9e3b07a766d814b7e882.claudemcpcontent.com"
}
},
"description": "Interactive shopping list with swipe-to-check",
"mimeType": "text/html;profile=mcp-app",
"name": "ShoppingList",
"uri": "ui://widget/ShoppingList.html"
},
{
"_meta": {
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "Activity history and usage insights",
"openai/widgetDomain": "https://www.pantrypersona.com",
"openai/widgetPrefersBorder": true,
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"domain": "bb64a469f82c9e3b07a766d814b7e882.claudemcpcontent.com"
}
},
"description": "Activity history and usage insights",
"mimeType": "text/html;profile=mcp-app",
"name": "Chronicle",
"uri": "ui://widget/Chronicle.html"
}
]
}
},
"url": "https://www.pantrypersona.com/api/mcp"
},
"latency_ms": 50.85,
"status": "ok"
},
"server_card": {
"details": {
"headers": {
"content-type": "application/json; charset=utf-8",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload"
},
"http_status": 200,
"payload": {
"$schema": "https://static.modelcontextprotocol.io/schemas/mcp-server-card/v1.json",
"authentication": {
"required": true,
"schemes": [
"oauth2",
"bearer"
]
},
"capabilities": {
"prompts": {
"listChanged": false
},
"resources": {
"listChanged": false,
"subscribe": false
},
"tools": {
"listChanged": false
}
},
"description": "AI-powered kitchen management \u2014 track pantry inventory, plan meals, manage recipes, and build shopping lists.",
"documentationUrl": "https://www.pantrypersona.com/docs",
"iconUrl": "https://www.pantrypersona.com/icon-192x192.png",
"prompts": [
"dynamic"
],
"protocolVersion": "2025-06-18",
"resources": [
"dynamic"
],
"serverInfo": {
"name": "pantry-persona",
"title": "Pantry Persona",
"version": "1.0.0"
},
"tools": [
"dynamic"
],
"transport": {
"endpoint": "/api/mcp",
"type": "streamable-http"
},
"version": "1.0"
},
"url": "https://www.pantrypersona.com/.well-known/mcp/server-card.json"
},
"latency_ms": 122.55,
"status": "ok"
},
"session_resume_probe": {
"details": {
"protocol_version": null,
"reason": "no_session_id",
"resume_expected": false,
"transport": "streamable-http"
},
"latency_ms": null,
"status": "missing"
},
"step_up_auth_probe": {
"details": {
"auth_required_checks": [
"initialize",
"prompt_get",
"resource_read"
],
"broad_scopes": [
"meal-plans:write",
"pantry:write",
"recipes:write",
"shopping:write"
],
"challenge_headers": [
"Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\"",
"Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\"",
"Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\""
],
"minimal_scope_documented": true,
"oauth_present": true,
"scope_specificity_ratio": 0.4286,
"step_up_signals": [
"Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\"",
"Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\"",
"Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\""
],
"supported_scopes": [
"meal-plans:read",
"meal-plans:write",
"pantry:read",
"pantry:write",
"profile:read",
"recipes:read",
"recipes:write",
"shopping:read",
"shopping:write"
]
},
"latency_ms": null,
"status": "ok"
},
"tool_snapshot_probe": {
"details": {
"added": [],
"changed_outputs": [],
"current_tool_count": 20,
"previous_tool_count": 20,
"removed": [],
"similarity": 1.0
},
"latency_ms": null,
"status": "ok"
},
"tools_list": {
"details": {
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload"
},
"http_status": 200,
"payload": {
"id": 2,
"jsonrpc": "2.0",
"result": {
"tools": [
{
"annotations": {
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Adds, removes, updates, checks, unchecks, or clears shopping list items, creates and updates stores, manages staple items, and exports the list to Instacart. Use this when the user wants to add items to their list, mark items as bought (\"I got milk\", \"picked up bread\"), set up staples or essentials, or export to Instacart. Do not use this for pantry inventory changes \u2014 call manage_pantry instead \u2014 or to display the current shopping list \u2014 call show_shopping.",
"inputSchema": {
"properties": {
"action": {
"description": "Action: add, remove, update, check, uncheck, clear, create_store, update_store, delete_store, add_staple, remove_staple, or export_instacart",
"enum": [
"add",
"remove",
"update",
"check",
"uncheck",
"clear",
"create_store",
"update_store",
"delete_store",
"add_staple",
"remove_staple",
"export_instacart"
],
"type": "string"
},
"allStores": {
"description": "For clear: true = clear ALL stores at once",
"type": "boolean"
},
"autoAdd": {
"description": "Whether staple auto-re-adds when cleared (default: true)",
"type": "boolean"
},
"categories": {
"description": "Custom aisle/section names for this store in walk-through order (e.g. [\"Produce\", \"Dairy\", \"Frozen\", \"Snacks\"]).",
"items": {
"type": "string"
},
"type": "array"
},
"clearAll": {
"description": "For clear: true = ALL items, false = only checked (default)",
"type": "boolean"
},
"defaultCategory": {
"description": "Fallback category when item does not match any aisle (e.g. \"other\")",
"type": "string"
},
"forProfile": {
"description": "Which profile this staple is for (e.g., \"kids\", \"Sarah\")",
"type": "string"
},
"items": {
"description": "Items to operate on. For add_staple: array of items to make staples. Not needed for clear, store, or remove_staple actions.",
"items": {
"properties": {
"brand": {
"description": "Preferred brand if any",
"type": "string"
},
"category": {
"description": "Recommended - use these exact IDs: produce, dairy, meat, seafood, deli, bakery, frozen, pantry, snacks, beverages, household, pet, other",
"type": "string"
},
"id": {
"description": "Item ID (for update/remove)",
"type": "string"
},
"name": {
"description": "Item name (e.g., \"milk\", \"apples\", \"bread\") - required for add, optional for remove by ID",
"type": "string"
},
"quantity": {
"description": "Quantity (default: 1)",
"type": "number"
},
"unit": {
"description": "Unit (e.g., \"gallon\", \"lb\", \"bunch\")",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"newStoreName": {
"description": "New store name (for create_store or rename via update_store)",
"type": "string"
},
"stapleId": {
"description": "Staple ID (for remove/pause/resume by ID)",
"type": "string"
},
"stapleName": {
"description": "Staple name (for remove_staple by name, e.g. \"Bread\")",
"type": "string"
},
"stapleNotes": {
"description": "Notes for the staple item",
"type": "string"
},
"storeId": {
"description": "Target store ID",
"type": "string"
},
"storeName": {
"description": "Target store name (or current name for update_store/delete_store)",
"type": "string"
}
},
"required": [
"action"
],
"type": "object"
},
"name": "manage_shopping",
"title": "Manage shopping list"
},
{
"annotations": {
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Adds, removes, updates, or consumes pantry items, logs leftovers, clears expired items, and recategorizes miscategorized items. Handles batches of up to 100 items per call. Use this when the user corrects their pantry inventory (\"I don't have X anymore\", \"we used the Y\", \"add these groceries\"), or reports cooked leftovers. Do not use this for shopping list changes \u2014 call manage_shopping instead \u2014 or to display the current pantry \u2014 call show_pantry.",
"inputSchema": {
"properties": {
"action": {
"description": "Action: add, remove, update, consume, clear_expired, add_leftover, or recategorize",
"enum": [
"add",
"remove",
"update",
"consume",
"clear_expired",
"add_leftover",
"recategorize"
],
"type": "string"
},
"items": {
"description": "Items to operate on (max 100, not needed for clear_expired or add_leftover)",
"items": {
"properties": {
"brand": {
"description": "Brand name (e.g., \"Johnsonville\", \"Kraft\")",
"type": "string"
},
"category": {
"description": "Recommended - use these exact IDs: fruits, vegetables, dairy, meat, seafood, deli, meat_alternatives, bread, pasta_rice_cereal, canned, frozen, snacks, beverages, condiments_spices, baking, household, pet, leftovers, other",
"type": "string"
},
"consumeAll": {
"description": "For consume action: consume the entire quantity of this item regardless of amount. Use when user says \"use all\", \"finished the\", \"used up all the\".",
"type": "boolean"
},
"expiresAt": {
"description": "Expiration date ISO string",
"type": "string"
},
"id": {
"description": "Item ID (for update/remove)",
"type": "string"
},
"isLeftover": {
"description": "True if this is leftover food",
"type": "boolean"
},
"location": {
"description": "Storage location (e.g., \"Fridge\", \"Pantry\") \u2014 accepted but not persisted",
"type": "string"
},
"name": {
"description": "Item name (e.g., \"salmon\", \"asparagus\", \"milk\")",
"type": "string"
},
"quantity": {
"description": "Quantity (default: 1)",
"type": "number"
},
"sourceMeal": {
"description": "Source meal for leftovers",
"type": "string"
},
"unit": {
"description": "Unit (e.g., \"lb\", \"bunch\", \"gallon\")",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"leftovers": {
"description": "Leftover items (max 50, only for add_leftover action)",
"items": {
"properties": {
"expiresInDays": {
"description": "Days until expiry (default: 7)",
"maximum": 30,
"minimum": 1,
"type": "integer"
},
"name": {
"description": "Leftover food name (e.g., \"chicken stir-fry\", \"pasta carbonara\")",
"type": "string"
},
"quantity": {
"description": "Number of portions/containers (default: 1)",
"type": "number"
},
"sourceMeal": {
"description": "Meal this came from (e.g., \"Tuesday dinner\")",
"type": "string"
},
"sourceRecipe": {
"description": "Recipe name this was made from",
"type": "string"
},
"unit": {
"description": "Unit (e.g., \"container\", \"portion\", \"bowl\")",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"action"
],
"type": "object"
},
"name": "manage_pantry",
"title": "Manage pantry inventory"
},
{
"_meta": {
"openai/toolInvocation/invoked": "Meal plan updated",
"openai/toolInvocation/invoking": "Updating meal plan..."
},
"annotations": {
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Commits meal assignments to the calendar. set updates one day, set_week replaces a whole week, clear removes meals in a range, move relocates meals between dates. Use this when the user has explicitly chosen specific meals to plan, typically from find_recipes results. Do not use this to browse or search for meal ideas \u2014 call find_recipes first to present options for the user to pick from before committing.",
"inputSchema": {
"properties": {
"action": {
"description": "Action: set (one day, preserves other slots), set_week (batch, replaces entire days), clear, or move",
"enum": [
"set",
"set_week",
"clear",
"move"
],
"type": "string"
},
"breakfast": {
"description": "Breakfast meal name",
"type": "string"
},
"breakfastRecipeId": {
"description": "Saved recipe ID for breakfast",
"type": "string"
},
"date": {
"description": "Date for set action (YYYY-MM-DD)",
"type": "string"
},
"dinner": {
"description": "Dinner meal name",
"type": "string"
},
"dinnerRecipeId": {
"description": "Saved recipe ID for dinner",
"type": "string"
},
"endDate": {
"description": "End date for clear action",
"type": "string"
},
"fromDate": {
"description": "Source date for move action",
"type": "string"
},
"lunch": {
"description": "Lunch meal name",
"type": "string"
},
"lunchRecipeId": {
"description": "Saved recipe ID for lunch",
"type": "string"
},
"mealsToDelete": {
"description": "Specific meals to clear",
"items": {
"enum": [
"breakfast",
"lunch",
"dinner",
"snack"
],
"type": "string"
},
"type": "array"
},
"mealsToMove": {
"description": "Specific meals to move",
"items": {
"enum": [
"breakfast",
"lunch",
"dinner",
"snack"
],
"type": "string"
},
"type": "array"
},
"mode": {
"description": "Move mode: move, swap, or copy",
"enum": [
"move",
"swap",
"copy"
],
"type": "string"
},
"plans": {
"description": "Day plans for set_week action",
"items": {
"properties": {
"breakfast": {
"description": "Breakfast meal name",
"type": "string"
},
"breakfastRecipeId": {
"description": "Saved recipe ID for breakfast",
"type": "string"
},
"dayOffset": {
"description": "Day offset (0=Mon, 6=Sun)",
"maximum": 6,
"minimum": 0,
"type": "number"
},
"dinner": {
"description": "Dinner meal name",
"type": "string"
},
"dinnerRecipeId": {
"description": "Saved recipe ID for dinner",
"type": "string"
},
"lunch": {
"description": "Lunch meal name",
"type": "string"
},
"lunchRecipeId": {
"description": "Saved recipe ID for lunch",
"type": "string"
},
"snack": {
"description": "Snack name",
"type": "string"
},
"snackRecipeId": {
"description": "Saved recipe ID for snack",
"type": "string"
}
},
"required": [
"dayOffset"
],
"type": "object"
},
"type": "array"
},
"profilesConsidered": {
"description": "Profile IDs for dietary validation",
"items": {
"type": "string"
},
"type": "array"
},
"snack": {
"description": "Snack name",
"type": "string"
},
"snackRecipeId": {
"description": "Saved recipe ID for snack",
"type": "string"
},
"startDate": {
"description": "Start date for clear action",
"type": "string"
},
"toDate": {
"description": "Target date for move action",
"type": "string"
},
"weekStart": {
"description": "Week start for set_week action",
"type": "string"
}
},
"required": [
"action"
],
"type": "object"
},
"name": "manage_meal_plan",
"title": "Manage meal plan"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Searches the user's saved recipes by name, ingredient, tag, collection, nutrition, time, or dietary profile. Returns recipe data for the model to reason over \u2014 does not render a widget. Use this when the user asks about recipes they have saved, or when the model needs recipe data for meal planning. Do not use this for web search or pantry-only questions \u2014 call get_pantry for pantry inventory and manage_recipes to save a new recipe the user found elsewhere.",
"inputSchema": {
"properties": {
"filter": {
"description": "Search and filter options",
"properties": {
"canMakeNow": {
"description": "Only show recipes with all ingredients in pantry",
"type": "boolean"
},
"collection": {
"description": "Filter by collection name or ID",
"type": "string"
},
"cursor": {
"description": "Pagination cursor from previous results",
"type": "string"
},
"difficulty": {
"description": "Recipe difficulty level",
"enum": [
"Easy",
"Medium",
"Hard"
],
"type": "string"
},
"forAllProfiles": {
"description": "Filter for all household profiles",
"type": "boolean"
},
"forProfiles": {
"description": "Filter for specific profile names",
"items": {
"type": "string"
},
"type": "array"
},
"ingredients": {
"description": "Must contain these ingredients",
"items": {
"type": "string"
},
"type": "array"
},
"limit": {
"description": "Maximum number of recipes to return",
"type": "number"
},
"maxCalories": {
"description": "Max calories per serving",
"type": "number"
},
"maxCarbs": {
"description": "Max carbs grams per serving",
"type": "number"
},
"maxFat": {
"description": "Max fat grams per serving",
"type": "number"
},
"maxTotalTime": {
"description": "Max total time in minutes",
"type": "number"
},
"minProtein": {
"description": "Min protein grams per serving",
"type": "number"
},
"query": {
"description": "Recipe name or keyword search (searches names and tags)",
"type": "string"
},
"sortBy": {
"description": "Sort order: relevance (default), quickest, newest, or rating",
"enum": [
"relevance",
"quickest",
"newest",
"rating"
],
"type": "string"
},
"tags": {
"description": "Filter by tags",
"items": {
"type": "string"
},
"type": "array"
},
"timeOfDay": {
"description": "Filter by time of day",
"enum": [
"breakfast",
"lunch",
"dinner",
"snack",
"any"
],
"type": "string"
}
},
"type": "object"
}
},
"type": "object"
},
"name": "find_recipes",
"title": "Find recipes"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Returns the user's pantry items as data for the model to reason over \u2014 does not render a widget. Use this when the model needs to check what ingredients the user has on hand, find items expiring soon, or match pantry contents against a recipe. Do not use this when the user explicitly wants to see their pantry \u2014 call show_pantry instead to display the widget.",
"inputSchema": {
"properties": {
"category": {
"description": "Filter by category (e.g., \"produce\", \"dairy\")",
"type": "string"
},
"expiringSoon": {
"description": "Only items expiring within 7 days",
"type": "boolean"
},
"expiringWithinDays": {
"description": "Only items expiring within N days",
"type": "number"
},
"itemIds": {
"description": "Specific pantry item IDs to fetch. When provided, other filters are ignored.",
"items": {
"type": "string"
},
"type": "array"
},
"searchTerm": {
"description": "Search by single item name (case-insensitive partial match). For multiple ingredients, use searchTerms instead.",
"type": "string"
},
"searchTerms": {
"description": "Search by multiple item names (case-insensitive partial match, OR semantics). PREFERRED when checking what the pantry has against several ingredients \u2014 pass them all in one call instead of calling get_pantry repeatedly.",
"items": {
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"name": "get_pantry",
"title": "Get pantry data"
},
{
"annotations": {
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": false
},
"description": "Saves, imports from URLs, updates, deletes, rates, or shares recipes in the user's saved collection. Use this when the user shares a URL (recipe site, TikTok, YouTube, Pinterest, Instagram \u2014 always use action save_urls, never fetch URLs yourself), pastes recipe text to save, edits an existing recipe, rates it, or generates a share link. Do not use this to browse or search saved recipes \u2014 call find_recipes instead \u2014 or to display recipes \u2014 call show_recipes.",
"inputSchema": {
"properties": {
"action": {
"description": "Action: save, save_urls, update, delete, delete_batch, batch_save, rate, or share",
"enum": [
"save",
"save_urls",
"update",
"delete",
"delete_batch",
"batch_save",
"rate",
"share"
],
"type": "string"
},
"deleteAll": {
"description": "Delete ALL recipes (for delete_batch action)",
"type": "boolean"
},
"expected_version": {
"description": "Expected updatedAt timestamp for optimistic concurrency (update action)",
"type": "string"
},
"query": {
"description": "Search query to find and delete matching recipes (for delete_batch action)",
"type": "string"
},
"rating": {
"description": "Star rating 1-5 (for rate action)",
"maximum": 5,
"minimum": 1,
"type": "integer"
},
"recipe": {
"description": "Recipe data for save action",
"properties": {
"cookTime": {
"description": "Cook time in minutes",
"maximum": 1440,
"minimum": 0,
"type": "integer"
},
"difficulty": {
"description": "Recipe difficulty level",
"enum": [
"Easy",
"Medium",
"Hard"
],
"type": "string"
},
"imageData": {
"description": "Base64 encoded image data (e.g., from cookbook photo). Format: data:image/jpeg;base64,... or raw base64",
"type": "string"
},
"imageUrl": {
"description": "Recipe image URL",
"type": "string"
},
"ingredients": {
"description": "List of ingredients",
"items": {
"properties": {
"name": {
"description": "Ingredient name",
"type": "string"
},
"quantity": {
"description": "Quantity needed",
"minimum": 0,
"type": "number"
},
"unit": {
"description": "Unit of measurement",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"name": {
"description": "Recipe name",
"type": "string"
},
"prepTime": {
"description": "Prep time in minutes",
"maximum": 1440,
"minimum": 0,
"type": "integer"
},
"servings": {
"description": "Number of servings",
"maximum": 100,
"type": "integer"
},
"sourceUrl": {
"description": "Original recipe source URL",
"type": "string"
},
"spiceLevel": {
"description": "Spice/heat level",
"type": "string"
},
"steps": {
"description": "Cooking instructions",
"items": {
"type": "string"
},
"type": "array"
},
"tags": {
"description": "Recipe tags",
"items": {
"type": "string"
},
"type": "array"
},
"text": {
"description": "Additional recipe notes or description",
"type": "string"
}
},
"required": [
"name",
"ingredients",
"steps"
],
"type": "object"
},
"recipeId": {
"description": "Recipe ID (for update, delete, rate, share actions)",
"type": "string"
},
"recipeIds": {
"description": "Array of recipe IDs (for delete_batch action)",
"items": {
"type": "string"
},
"type": "array"
},
"recipeName": {
"description": "Recipe name for lookup (delete, share actions)",
"type": "string"
},
"recipes": {
"description": "Array of recipes (for batch_save action)",
"items": {
"properties": {
"cookTime": {
"description": "Cook time in minutes",
"maximum": 1440,
"minimum": 0,
"type": "integer"
},
"difficulty": {
"description": "Recipe difficulty level",
"enum": [
"Easy",
"Medium",
"Hard"
],
"type": "string"
},
"imageData": {
"description": "Base64 encoded image data (e.g., from cookbook photo). Format: data:image/jpeg;base64,... or raw base64",
"type": "string"
},
"imageUrl": {
"description": "Recipe image URL",
"type": "string"
},
"ingredients": {
"description": "List of ingredients",
"items": {
"properties": {
"name": {
"description": "Ingredient name",
"type": "string"
},
"quantity": {
"description": "Quantity needed",
"minimum": 0,
"type": "number"
},
"unit": {
"description": "Unit of measurement",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"name": {
"description": "Recipe name",
"type": "string"
},
"prepTime": {
"description": "Prep time in minutes",
"maximum": 1440,
"minimum": 0,
"type": "integer"
},
"servings": {
"description": "Number of servings",
"maximum": 100,
"type": "integer"
},
"sourceUrl": {
"description": "Original recipe source URL",
"type": "string"
},
"spiceLevel": {
"description": "Spice/heat level",
"type": "string"
},
"steps": {
"description": "Cooking instructions",
"items": {
"type": "string"
},
"type": "array"
},
"tags": {
"description": "Recipe tags",
"items": {
"type": "string"
},
"type": "array"
},
"text": {
"description": "Additional recipe notes or description",
"type": "string"
}
},
"required": [
"name",
"ingredients",
"steps"
],
"type": "object"
},
"type": "array"
},
"updates": {
"description": "Fields to update (for update action)",
"properties": {
"addTags": {
"description": "Tags to ADD to existing tags (merge mode)",
"items": {
"type": "string"
},
"type": "array"
},
"cookTime": {
"description": "Updated cook time in minutes",
"maximum": 1440,
"minimum": 0,
"type": "integer"
},
"difficulty": {
"description": "Updated difficulty level",
"enum": [
"Easy",
"Medium",
"Hard"
],
"type": "string"
},
"imageData": {
"description": "Base64 encoded image data (e.g., from pasted photo). Format: data:image/jpeg;base64,... or raw base64",
"type": "string"
},
"imageUrl": {
"description": "New image URL",
"type": "string"
},
"ingredients": {
"description": "Updated ingredients list",
"items": {
"properties": {
"name": {
"description": "Ingredient name",
"type": "string"
},
"quantity": {
"description": "Quantity needed",
"minimum": 0,
"type": "number"
},
"unit": {
"description": "Unit of measurement",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"name": {
"description": "New recipe name",
"type": "string"
},
"prepTime": {
"description": "Updated prep time in minutes",
"maximum": 1440,
"minimum": 0,
"type": "integer"
},
"removeTags": {
"description": "Tags to REMOVE from existing tags",
"items": {
"type": "string"
},
"type": "array"
},
"servings": {
"description": "Updated number of servings",
"maximum": 100,
"type": "integer"
},
"sourceUrl": {
"description": "Updated source URL",
"type": "string"
},
"spiceLevel": {
"description": "Updated spice/heat level",
"type": "string"
},
"steps": {
"description": "Updated cooking instructions",
"items": {
"type": "string"
},
"type": "array"
},
"tags": {
"description": "Replace ALL tags (full overwrite)",
"items": {
"type": "string"
},
"type": "array"
},
"text": {
"description": "Updated recipe notes or description",
"type": "string"
}
},
"type": "object"
},
"urls": {
"description": "Recipe URLs to import (1-20) for save_urls action. Supports recipe websites, TikTok, YouTube, Pinterest, and Instagram URLs.",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"action"
],
"type": "object"
},
"name": "manage_recipes",
"title": "Manage recipes"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Generates a shopping list from the user's saved meal plan \u2014 loads the planned recipes, extracts their ingredients, checks the pantry, and adds what's missing to the shopping list in a single call. Use this when the user says \"shop for my meals\", \"what do I need to buy for this week\", or right after committing a new meal plan. Do not use this to add individual items to the shopping list \u2014 call manage_shopping with the add action instead.",
"inputSchema": {
"properties": {
"checkPantry": {
"description": "Skip items in pantry (default: true)",
"type": "boolean"
},
"endDate": {
"description": "End date (YYYY-MM-DD). Auto-detects if not specified.",
"type": "string"
},
"startDate": {
"description": "Start date (YYYY-MM-DD). Defaults to today.",
"type": "string"
},
"storeId": {
"description": "Target store ID",
"type": "string"
},
"storeName": {
"description": "Target store name",
"type": "string"
}
},
"type": "object"
},
"name": "shop_for_meal_plan",
"title": "Shop for meal plan"
},
{
"annotations": {
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Logs a finished cooking session \u2014 deducts the recipe's ingredients from the pantry (skipping staples like salt, water, oil) and increments the recipe's cook history. Use this when the user says they finished cooking, made, ate, or had a meal, including casual past-tense like \"we had burgers tonight\" or \"I made the pasta\". Do not use this when the user is asking about recipes they might make, just browsing, or viewing meal plan options \u2014 call find_recipes or show_recipes instead.",
"inputSchema": {
"properties": {
"deductFromPantry": {
"description": "Remove used ingredients from pantry. Default true \u2014 set to false if the user explicitly says not to deduct.",
"type": "boolean"
},
"recipeId": {
"description": "Recipe ID (only use if recipeName unavailable)",
"type": "string"
},
"recipeName": {
"description": "Recipe name - PREFERRED over recipeId",
"type": "string"
},
"servings": {
"description": "Number of servings cooked (scales ingredient deduction)",
"type": "number"
}
},
"type": "object"
},
"name": "post_cook",
"title": "Log cooked recipe"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Processes a grocery receipt and adds the items to the user's pantry in a single call \u2014 dedupes same-name items, classifies categories, estimates expiration dates, records prices, and auto-checks off matching shopping list items. Use this when the user uploads a receipt image (read with vision first to extract items), types receipt items like \"milk 3.99, eggs 4.50\", or pastes receipt text. Do not use this for individual pantry additions \u2014 call manage_pantry with the add action instead.",
"inputSchema": {
"properties": {
"items": {
"description": "Items from receipt(s)",
"items": {
"properties": {
"brand": {
"description": "Brand name if identified (e.g., \"Kerrygold\", \"Kraft\")",
"type": "string"
},
"category": {
"description": "Product category",
"type": "string"
},
"name": {
"description": "Clean product name",
"type": "string"
},
"original_text": {
"description": "Original receipt text",
"type": "string"
},
"price": {
"description": "Price paid",
"type": "number"
},
"quantity": {
"description": "Quantity (default 1)",
"type": "number"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"receiptDate": {
"description": "Date from receipt",
"type": "string"
},
"storeName": {
"description": "Store name",
"type": "string"
}
},
"required": [
"items"
],
"type": "object"
},
"name": "process_receipt",
"title": "Process receipt"
},
{
"_meta": {
"openai/toolInvocation/invoked": "Insights ready",
"openai/toolInvocation/invoking": "Crunching the numbers..."
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Returns analytics \u2014 spending, price history, brand preferences, shopping patterns, restock predictions, and consumption \u2014 as a headline, metrics, highlights, and talking points for the model to narrate, without rendering a widget. Use this when the user asks \"how much do I spend\", \"what brands do I buy\", \"when will I run out of X\", \"show my kitchen stats\", or \"Kitchen Chronicle\". Do not use this for individual recipe or pantry lookups \u2014 call find_recipes or get_pantry instead.",
"inputSchema": {
"properties": {
"compareToLastPeriod": {
"description": "Compare to previous period",
"type": "boolean"
},
"daysAhead": {
"description": "How many days ahead to predict (default: 14)",
"maximum": 30,
"minimum": 1,
"type": "integer"
},
"itemName": {
"description": "Item name for price_history or consumption_insight",
"type": "string"
},
"limit": {
"description": "Max items to return (default: 10)",
"type": "number"
},
"minPurchases": {
"description": "Min purchases to include (default: 3)",
"maximum": 10,
"minimum": 2,
"type": "integer"
},
"period": {
"description": "Time period for spending (default: month)",
"enum": [
"week",
"month",
"quarter",
"year"
],
"type": "string"
},
"topN": {
"description": "Top N items for patterns (default: 10)",
"type": "number"
},
"type": {
"description": "Type of insight",
"enum": [
"spending",
"price_history",
"brand_preferences",
"shopping_patterns",
"restock_predictions",
"consumption_insight",
"consumption_patterns"
],
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
"name": "get_insights",
"title": "Get insights"
},
{
"_meta": {
"openai/toolInvocation/invoked": "Profiles updated",
"openai/toolInvocation/invoking": "Updating profiles..."
},
"annotations": {
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Creates, updates, or deletes household member profiles \u2014 eating rules, dietary exclusions, likes, dislikes, and per-member favorites. Household-level settings (schedules, planning workflows, kitchen rules) live on the special Household profile. Use this when the user adds or edits a person (\"add my daughter Sarah\", \"Ben is vegetarian now\"), captures a reusable planning workflow, or deletes a profile. Do not use this for product brand preferences \u2014 call manage_preferences instead \u2014 or to display profiles \u2014 call show_profiles.",
"inputSchema": {
"properties": {
"action": {
"description": "Action to perform",
"enum": [
"create",
"update",
"delete"
],
"type": "string"
},
"confirmDelete": {
"description": "Set true to confirm deletion (person profiles only)",
"type": "boolean"
},
"diets": {
"description": "Eating patterns: 'vegetarian', 'vegan', 'keto', 'paleo' (person profiles)",
"items": {
"type": "string"
},
"type": "array"
},
"dislikes": {
"description": "Foods they dislike: 'cilantro', 'olives' (person profiles)",
"items": {
"type": "string"
},
"type": "array"
},
"exclusions": {
"description": "Food exclusions: 'dairy', 'shellfish', 'casseroles' (both profile types)",
"items": {
"type": "string"
},
"type": "array"
},
"goals": {
"description": "Health goals: 'high protein', 'weight loss', 'muscle gain' (person profiles)",
"items": {
"type": "string"
},
"type": "array"
},
"isHousehold": {
"description": "True for household settings profile (max 1 per account, auto-created). Stores meal rules, schedules, cooking preferences.",
"type": "boolean"
},
"likes": {
"description": "Foods they like: 'spicy food', 'Italian', 'sushi' (person profiles)",
"items": {
"type": "string"
},
"type": "array"
},
"name": {
"description": "Profile name (required for create). Use \"Household\" for the household settings profile.",
"type": "string"
},
"notes": {
"description": "Free-form notes for cooking preferences and kitchen rules (not grocery items \u2014 use manage_shopping add_staple). Household: 4000 chars. Person: 2000 chars.",
"type": "string"
},
"planningWorkflow": {
"description": "Saved meal planning workflow (household only). Steps the AI follows when user asks to plan meals. Use manage_profiles action:update to save after a successful planning session.",
"properties": {
"steps": {
"items": {
"properties": {
"description": {
"type": "string"
},
"label": {
"type": "string"
},
"toolHint": {
"type": "string"
}
},
"required": [
"label"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"steps"
],
"type": "object"
},
"profileId": {
"description": "Profile ID (for update/delete)",
"type": "string"
},
"profileName": {
"description": "Profile name (for lookup or create). Use \"Household\" for household settings.",
"type": "string"
},
"profileNames": {
"description": "Multiple profile names for batch update. Apply the same data changes to all listed profiles in one call. Example: [\"Lila\", \"Ben\"] to update both kids at once.",
"items": {
"type": "string"
},
"type": "array"
},
"replaceNotes": {
"description": "If true, completely replace notes instead of merging with existing. Use when fixing corrupted/duplicated data.",
"type": "boolean"
},
"schedulingRules": {
"description": "Day-of-week rules (household only): { monday: \"quick meals (gymnastics)\", wednesday: \"Grandparent Night\" }",
"required": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday",
"sunday"
],
"type": "object"
}
},
"required": [
"action"
],
"type": "object"
},
"name": "manage_profiles",
"title": "Manage profiles"
},
{
"_meta": {
"openai/toolInvocation/invoked": "Collections updated",
"openai/toolInvocation/invoking": "Updating collections..."
},
"annotations": {
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Creates, renames, deletes, or lists recipe collections, and adds or removes recipes from them. Auto-creates a collection if it does not exist when adding recipes. Use this when the user says \"add to favorites\", \"take out of\", \"create a [name] collection\", or associates a recipe with a person or occasion. Do not use this to save new recipes \u2014 call manage_recipes instead \u2014 or to display the collection contents \u2014 call show_recipes.",
"inputSchema": {
"properties": {
"action": {
"description": "Action to perform",
"enum": [
"create",
"update",
"delete",
"add_recipes",
"remove_recipes",
"list"
],
"type": "string"
},
"collectionId": {
"description": "Collection ID",
"type": "string"
},
"collectionName": {
"description": "Collection name (for lookup or create)",
"type": "string"
},
"color": {
"description": "Color code",
"type": "string"
},
"description": {
"description": "Collection description",
"type": "string"
},
"emoji": {
"description": "Emoji icon",
"type": "string"
},
"name": {
"description": "New name for collection",
"type": "string"
},
"recipeIds": {
"description": "Recipe IDs to add/remove",
"items": {
"type": "string"
},
"type": "array"
},
"recipeNames": {
"description": "Recipe names to add/remove",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"action"
],
"type": "object"
},
"name": "manage_collections",
"title": "Manage collections"
},
{
"_meta": {
"openai/toolInvocation/invoked": "Preferences saved",
"openai/toolInvocation/invoking": "Saving preferences..."
},
"annotations": {
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Sets, clears, lists, or resets the user's saved product brand preferences \u2014 which brand, size, variant, or unit they prefer for a given item. Use this when the user says \"I prefer [brand] for [item]\", \"use [brand] butter\", \"forget my [item] preference\", or \"what are my brand preferences\". Do not use this for household dietary profiles \u2014 call manage_profiles instead \u2014 or for recipe-level preferences \u2014 those live on the recipe itself via manage_recipes.",
"inputSchema": {
"properties": {
"action": {
"description": "Action to perform",
"enum": [
"set",
"clear",
"list",
"reset_all"
],
"type": "string"
},
"brand": {
"description": "Preferred brand",
"type": "string"
},
"category": {
"description": "Preferred category for this item",
"type": "string"
},
"confirmReset": {
"description": "Set true to confirm resetting all preferences",
"type": "boolean"
},
"itemName": {
"description": "Item name",
"type": "string"
},
"limit": {
"description": "Max preferences to return",
"type": "number"
},
"minConfidence": {
"description": "Filter by minimum confidence",
"type": "number"
},
"size": {
"description": "Preferred size",
"type": "string"
},
"unit": {
"description": "Preferred unit",
"type": "string"
},
"upc": {
"description": "UPC code",
"type": "string"
},
"variant": {
"description": "Preferred variant",
"type": "string"
}
},
"required": [
"action"
],
"type": "object"
},
"name": "manage_preferences",
"title": "Manage preferences"
},
{
"_meta": {
"openai/toolInvocation/invoked": "Kitchen snapshot ready",
"openai/toolInvocation/invoking": "Loading your kitchen..."
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Use this when the user says hello, asks about their household, pantry, or meals, or asks to plan meals. Returns kitchen snapshot: dietary profiles, pantry highlights, expiring items, today's meal plan, shopping status, staple tracking, and saved planning workflow. Not for weather or general knowledge. Call once per query.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "get_user_context",
"title": "Get kitchen snapshot"
},
{
"_meta": {
"openai/outputTemplate": "ui://widget/ShoppingList.html",
"openai/toolInvocation/invoked": "List ready",
"openai/toolInvocation/invoking": "Loading your list...",
"openai/widgetAccessible": true,
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "Shopping list with swipe-to-check functionality",
"openai/widgetDomain": "https://www.pantrypersona.com",
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"resourceUri": "ui://widget/ShoppingList.html",
"resourceUrl": "https://www.pantrypersona.com/widgets/shopping.html"
}
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Displays the user's shopping list as an interactive widget, grouped by store and aisle order when available. Use this when the user asks about their list, says \"going shopping\", \"heading to [store]\", \"what do I need\", or \"export my list\", or right after manage_shopping mutates items. Do not use this to add, check, or remove items \u2014 call manage_shopping with the appropriate action instead.",
"inputSchema": {
"properties": {
"storeId": {
"description": "Filter by specific store ID",
"type": "string"
},
"storeName": {
"description": "Filter by store name",
"type": "string"
}
},
"type": "object"
},
"name": "show_shopping",
"title": "Show shopping list"
},
{
"_meta": {
"openai/outputTemplate": "ui://widget/Pantry.html",
"openai/toolInvocation/invoked": "Pantry ready",
"openai/toolInvocation/invoking": "Loading your pantry...",
"openai/widgetAccessible": true,
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "Pantry inventory with expiration tracking",
"openai/widgetDomain": "https://www.pantrypersona.com",
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"resourceUri": "ui://widget/Pantry.html",
"resourceUrl": "https://www.pantrypersona.com/widgets/pantry.html"
}
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Displays the user's pantry inventory as an interactive widget, grouped by category with expiration tracking. Use this when the user should see their pantry \u2014 explicit request (\"show me my pantry\"), post-mutation confirmation, or when a visual view will help them understand what they have. Do not use this for reasoning about pantry contents \u2014 call get_pantry instead for a pure data read.",
"inputSchema": {
"properties": {
"category": {
"description": "Filter by category (fallback when itemIds not provided)",
"type": "string"
},
"expiringSoon": {
"description": "Show only items expiring within 7 days",
"type": "boolean"
},
"expiringWithinDays": {
"description": "Show items expiring within N days",
"type": "number"
},
"itemIds": {
"description": "Specific pantry item IDs to display. PREFERRED for showing a subset (e.g., items relevant to a specific meal). When provided, other filters are ignored.",
"items": {
"type": "string"
},
"type": "array"
},
"searchTerm": {
"description": "Search by item name (fallback when itemIds not provided)",
"type": "string"
}
},
"type": "object"
},
"name": "show_pantry",
"title": "Show pantry"
},
{
"_meta": {
"openai/outputTemplate": "ui://widget/Recipes.html",
"openai/toolInvocation/invoked": "Recipes ready",
"openai/toolInvocation/invoking": "Loading your recipes...",
"openai/widgetAccessible": true,
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "Recipe collection with filtering and search",
"openai/widgetDomain": "https://www.pantrypersona.com",
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"resourceUri": "ui://widget/Recipes.html",
"resourceUrl": "https://www.pantrypersona.com/widgets/recipes.html"
}
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Displays saved recipes as an interactive widget for the user to see. Use this when the user asks to find, see, browse, or look at recipes (phrases like \"find me X\", \"show me X\", \"what recipes do I have\"). Accepts recipeIds for a specific subset, or query/tags to filter, or no parameters to show the full collection. Do not use this for pure data reasoning that does not need a visible widget \u2014 call find_recipes instead.",
"inputSchema": {
"properties": {
"limit": {
"description": "Maximum recipes to return",
"type": "number"
},
"offset": {
"description": "Number of recipes to skip (for pagination)",
"type": "number"
},
"query": {
"description": "Search by recipe name (fallback when recipeIds not provided)",
"type": "string"
},
"recipeIds": {
"description": "Specific recipe IDs to display. PREFERRED: pass IDs from find_recipes results to show the matches the model selected. When provided, query/tags filters are ignored.",
"items": {
"type": "string"
},
"type": "array"
},
"tags": {
"description": "Filter by tags (fallback when recipeIds not provided)",
"items": {
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"name": "show_recipes",
"title": "Show recipes"
},
{
"_meta": {
"openai/outputTemplate": "ui://widget/MealPlan.html",
"openai/toolInvocation/invoked": "Meal plan ready",
"openai/toolInvocation/invoking": "Loading your meal plan...",
"openai/widgetAccessible": true,
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "Weekly meal planning calendar",
"openai/widgetDomain": "https://www.pantrypersona.com",
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"resourceUri": "ui://widget/MealPlan.html",
"resourceUrl": "https://www.pantrypersona.com/widgets/meal-plan.html"
}
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Displays the user's weekly meal plan as a calendar widget, with today's meal highlighted and unconfirmed past meals surfaced for cooking confirmation. Use this when the user asks about meals, what's planned, needs meal plan context for the week, or right after manage_meal_plan mutates the plan. Do not use this to edit the plan \u2014 call manage_meal_plan with the appropriate action instead.",
"inputSchema": {
"properties": {
"date": {
"description": "Focus on specific day",
"enum": [
"today",
"tomorrow",
"week"
],
"type": "string"
},
"startDate": {
"description": "Week start date (YYYY-MM-DD)",
"type": "string"
}
},
"type": "object"
},
"name": "show_meal_plan",
"title": "Show meal plan"
},
{
"_meta": {
"openai/outputTemplate": "ui://widget/Profiles.html",
"openai/toolInvocation/invoked": "Profiles ready",
"openai/toolInvocation/invoking": "Loading profiles...",
"openai/widgetAccessible": true,
"openai/widgetCSP": {
"connect_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"frame_domains": [],
"redirect_domains": [
"https://www.instacart.com"
],
"resource_domains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"openai/widgetDescription": "Household profiles and dietary preferences",
"openai/widgetDomain": "https://www.pantrypersona.com",
"ui": {
"csp": {
"connectDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
],
"resourceDomains": [
"https://www.pantrypersona.com",
"https://pantrypersona.com",
"https://*.supabase.co"
]
},
"resourceUri": "ui://widget/Profiles.html",
"resourceUrl": "https://www.pantrypersona.com/widgets/profiles.html"
}
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Displays the user's household food profiles \u2014 diets, exclusions, likes, dislikes, and dietary goals for each member \u2014 as an interactive widget. Use this when the user asks about household members, dietary preferences, allergies, eating rules, or \"who can eat what\", or right after manage_profiles mutates a profile. Do not use this to create or edit profiles \u2014 call manage_profiles with the appropriate action instead.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "show_profiles",
"title": "Show household profiles"
},
{
"_meta": {
"openai/toolInvocation/invoked": "Here's what to do next",
"openai/toolInvocation/invoking": "Checking your setup...",
"openai/widgetAccessible": true
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Returns the user's adoption status across the six main features (profiles, pantry, recipes, shopping, meal plan, receipts) along with personalized next-step suggestions and sample prompts. Use this when the user asks \"what can I do\", \"what features haven't I tried\", \"help me get started\", or seems unsure how to use the app. Do not use this when the user has a specific action in mind \u2014 call the relevant manage or show tool directly.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "get_next_steps",
"title": "Get personalized next steps"
}
]
}
},
"url": "https://www.pantrypersona.com/api/mcp"
},
"latency_ms": 191.78,
"status": "ok"
},
"transport_compliance_probe": {
"details": {
"bad_protocol_error": null,
"bad_protocol_headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload"
},
"bad_protocol_payload": {
"error": {
"code": -32000,
"message": "Bad Request: Unsupported protocol version: 1999-99-99 (supported versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07)"
},
"id": null,
"jsonrpc": "2.0"
},
"bad_protocol_status_code": 400,
"delete_error": null,
"delete_status_code": null,
"expired_session_error": null,
"expired_session_status_code": null,
"issues": [
"missing_protocol_header"
],
"last_event_id_visible": false,
"protocol_header_present": false,
"requested_protocol_version": "2025-03-26",
"session_id_present": false,
"transport": "streamable-http"
},
"latency_ms": 50.87,
"status": "warning"
},
"utility_coverage_probe": {
"details": {
"completions": {
"advertised": false,
"live_probe": "not_executed",
"sample_target": {
"argument_name": "startDay",
"name": "plan_weekly_meals",
"type": "prompt"
}
},
"initialize_capability_keys": [],
"pagination": {
"metadata_signal": false,
"next_cursor_methods": [],
"supported": false
},
"tasks": {
"advertised": false,
"http_status": 401,
"probe_status": "auth_required"
}
},
"latency_ms": 17.73,
"status": "ok"
}
},
"failures": {
"initialize": {
"error": "Client error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401",
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload",
"www-authenticate": "Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\""
},
"http_status": 401,
"payload": {},
"url": "https://www.pantrypersona.com/api/mcp"
},
"prompt_get": {
"error": "Client error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401",
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload",
"www-authenticate": "Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\""
},
"http_status": 401,
"payload": {},
"prompt_arguments": [
{
"description": "Which day to start the week on",
"name": "startDay",
"required": false
}
],
"prompt_name": "plan_weekly_meals",
"reason": "auth_required",
"url": "https://www.pantrypersona.com/api/mcp"
},
"resource_read": {
"error": "Client error '401 Unauthorized' for url 'https://www.pantrypersona.com/api/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401",
"headers": {
"content-type": "application/json",
"strict-transport-security": "max-age=63072000; includeSubDomains; preload",
"www-authenticate": "Bearer resource_metadata=\"https://www.pantrypersona.com/.well-known/oauth-protected-resource\", error=\"invalid_request\", error_description=\"Missing or malformed Authorization header\""
},
"http_status": 401,
"payload": {},
"reason": "auth_required",
"resource_uri": "ui://widget/Pantry.html",
"url": "https://www.pantrypersona.com/api/mcp"
}
},
"remote_url": "https://www.pantrypersona.com/api/mcp",
"server_card_payload": {
"$schema": "https://static.modelcontextprotocol.io/schemas/mcp-server-card/v1.json",
"authentication": {
"required": true,
"schemes": [
"oauth2",
"bearer"
]
},
"capabilities": {
"prompts": {
"listChanged": false
},
"resources": {
"listChanged": false,
"subscribe": false
},
"tools": {
"listChanged": false
}
},
"description": "AI-powered kitchen management \u2014 track pantry inventory, plan meals, manage recipes, and build shopping lists.",
"documentationUrl": "https://www.pantrypersona.com/docs",
"iconUrl": "https://www.pantrypersona.com/icon-192x192.png",
"prompts": [
"dynamic"
],
"protocolVersion": "2025-06-18",
"resources": [
"dynamic"
],
"serverInfo": {
"name": "pantry-persona",
"title": "Pantry Persona",
"version": "1.0.0"
},
"tools": [
"dynamic"
],
"transport": {
"endpoint": "/api/mcp",
"type": "streamable-http"
},
"version": "1.0"
},
"server_identifier": "com.pantrypersona/pantry-persona"
}
Known versions
1.0.0
Validation history
7 day score delta
+0.0
30 day score delta
+0.0
Recent healthy ratio
0%
Freshness
594.1h
| Timestamp | Status | Score | Latency | Tools |
|---|---|---|---|---|
| Apr 09, 2026 09:08:21 AM UTC | Degraded | 80.6 | 1695.7 ms | 20 |
| Apr 09, 2026 01:07:54 AM UTC | Degraded | 80.6 | 3964.4 ms | 20 |
| Apr 08, 2026 05:07:12 PM UTC | Degraded | 81.1 | 2933.8 ms | 20 |
| Apr 08, 2026 09:06:39 AM UTC | Degraded | 81.1 | 2366.0 ms | 20 |
| Apr 08, 2026 01:06:07 AM UTC | Degraded | 80.1 | 3426.6 ms | 20 |
| Apr 07, 2026 05:05:17 PM UTC | Degraded | 78.6 | 2956.3 ms | 19 |
| Apr 07, 2026 09:04:36 AM UTC | Degraded | 81.1 | 3336.6 ms | 19 |
| Apr 07, 2026 01:04:00 AM UTC | Degraded | 80.6 | 2528.7 ms | 19 |
Validation timeline
| Validated | Summary | Score | Protocol | Auth mode | Tools | High-risk tools | Changes |
|---|---|---|---|---|---|---|---|
| Apr 09, 2026 09:08:21 AM UTC | Degraded | 80.6 | unknown | oauth_required | 20 | 11 | write_surface_expanded |
| Apr 09, 2026 01:07:54 AM UTC | Degraded | 80.6 | unknown | oauth_required | 20 | 9 | none |
| Apr 08, 2026 05:07:12 PM UTC | Degraded | 81.1 | unknown | oauth_required | 20 | 9 | none |
| Apr 08, 2026 09:06:39 AM UTC | Degraded | 81.1 | unknown | oauth_required | 20 | 9 | none |
| Apr 08, 2026 01:06:07 AM UTC | Degraded | 80.1 | unknown | oauth_required | 20 | 9 | tool_snapshot_changed |
| Apr 07, 2026 05:05:17 PM UTC | Degraded | 78.6 | unknown | oauth_required | 19 | 10 | tool_snapshot_changed |
| Apr 07, 2026 09:04:36 AM UTC | Degraded | 81.1 | unknown | oauth_required | 19 | 10 | none |
| Apr 07, 2026 01:04:00 AM UTC | Degraded | 80.6 | unknown | oauth_required | 19 | 10 | none |
| Apr 06, 2026 05:03:42 PM UTC | Degraded | 81.1 | unknown | oauth_required | 19 | 10 | none |
| Apr 06, 2026 09:02:51 AM UTC | Degraded | 81.1 | unknown | oauth_required | 19 | 10 | none |
| Apr 06, 2026 01:02:11 AM UTC | Degraded | 80.6 | unknown | oauth_required | 19 | 10 | none |
| Apr 05, 2026 05:00:13 PM UTC | Degraded | 81.1 | unknown | oauth_required | 19 | 10 | none |
Recent validation runs
| Started | Status | Summary | Latency | Checks |
|---|---|---|---|---|
| Apr 09, 2026 09:08:19 AM UTC | Completed | Degraded | 1695.7 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 09, 2026 01:07:50 AM UTC | Completed | Degraded | 3964.4 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 08, 2026 05:07:09 PM UTC | Completed | Degraded | 2933.8 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 08, 2026 09:06:37 AM UTC | Completed | Degraded | 2366.0 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 08, 2026 01:06:04 AM UTC | Completed | Degraded | 3426.6 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 07, 2026 05:05:14 PM UTC | Completed | Degraded | 2956.3 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 07, 2026 09:04:33 AM UTC | Completed | Degraded | 3336.6 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 07, 2026 01:03:58 AM UTC | Completed | Degraded | 2528.7 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 06, 2026 05:03:39 PM UTC | Completed | Degraded | 2953.6 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 06, 2026 09:02:47 AM UTC | Completed | Degraded | 3430.2 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |