{"schema_version":"verify.compare.v1","generated_at":"2026-09-10T23:31:40.018453+00:00","count":1,"missing_servers":[],"results":[{"server_id":"awesome-reachpad/reachpad-mcp","display_name":"Reachpad/reachpad-mcp","profile_url":"https://verify.sentinelsignal.io/servers/awesome-reachpad/reachpad-mcp","compare_url":"https://verify.sentinelsignal.io/compare?server=awesome-reachpad%2Freachpad-mcp","trust_summary_url":"https://verify.sentinelsignal.io/v1/servers/awesome-reachpad/reachpad-mcp/trust-summary","claimed":false,"verified_publisher":false,"claim_status":"unclaimed","badge_url":"https://verify.sentinelsignal.io/badge/awesome-reachpad/reachpad-mcp.svg","report_url":"https://verify.sentinelsignal.io/v1/servers/awesome-reachpad/reachpad-mcp/report","policy_url":"https://verify.sentinelsignal.io/v1/servers/awesome-reachpad/reachpad-mcp/policy","evidence_url":"https://verify.sentinelsignal.io/api/v1/servers/awesome-reachpad/reachpad-mcp/evidence","commerce_signal":null,"payment_capable":null,"delegation_level":null,"risk_flags":[],"strengths":["report_available","policy_available","badge_available"],"limitations":["unclaimed_profile","publisher_not_verified"],"last_seen":null,"last_scored":"2026-09-10T18:18:50.366194+00:00","recommended_agent_action":"allow_with_policy_review","observed_attention":{"schema":"verify.observed_attention.v1","window_days":30,"level":"none","label":"No observed attention","summary":"No recent machine-readable trust or discovery activity observed for this server.","segments":{"useful_ai_user":{"level":"none","observed":false,"description":"AI-assisted user sessions such as ChatGPT/User or Claude/User."},"machine_trust_evaluator":{"level":"none","observed":false,"description":"Synthetic sessions inspecting multiple trust surfaces such as report, policy, ledger, badge, trust-summary, or compare."},"possible_agent_or_script":{"level":"none","observed":false,"description":"Structured direct sessions with rapid profile, compare, report, policy, badge, or trust-surface fan-out."},"isolated_machine_surface":{"level":"none","observed":false,"description":"Aged-out direct synthetic singleton sessions that touched a machine-readable trust surface without becoming a broader evaluator."},"ai_crawler":{"level":"none","observed":false,"description":"Known AI crawler activity such as ClaudeBot, GPTBot, or similar crawlers."},"search_crawler":{"level":"none","observed":false,"description":"Search and SEO crawler activity."},"browser_like_automation":{"level":"none","observed":false,"description":"Browser-like synthetic sessions with rapid structured endpoint activity."},"confirmed_human":{"level":"none","observed":false,"description":"Confirmed browser-session human activity."}},"surfaces_observed":{"server_profile":false,"compare":false,"compare_json":false,"compare_api":false,"report_json":false,"policy":false,"ledger":false,"badge_metadata":false,"badge_svg":false,"trust_summary":false,"mcp_tool":false},"claim_prompt":{"recommended":false,"reason":"No claim prompt is recommended from observed attention in the current window."},"notes":["Observed attention is based on segmented first-party telemetry.","Crawler and evaluator activity is not treated as confirmed human demand.","Public levels are bucketed to avoid exposing raw traffic counts."]},"owner_activation":{"claim_recommended":false,"reason":"no_observed_attention"}}],"servers":[{"namespace":"awesome-reachpad","name":"reachpad-mcp","title":"Reachpad/reachpad-mcp","description":"Reachpad/reachpad-mcp Reachpad/reachpad-mcp](https://glama.ai/mcp/servers/qjk8wultuz) 🎖️ 📇 ☁️ 🍎 🪟 🐧 - Give any coding agent a persistent cloud development environment it can create, run commands in, checkpoint and fork. The filesystem, installed dependencies, running services and terminal state survive between calls, so a paused environment resumes instead of booting fresh. Available as a hosted remote server at `https://reachpad.dev/mcp` (OAuth, nothing to install) or over stdio with `npx @reachpad/mcp`.","homepage_url":"https://github.com/Reachpad/reachpad-mcp","docs_url":"https://github.com/Reachpad/reachpad-mcp","icon_url":null,"support_url":"https://github.com/Reachpad/reachpad-mcp","remote_url":"https://reachpad.dev/mcp","server_card_url":null,"latest_version":null,"current_status":"healthy","current_score":72.92,"transport_type":"streamable-http","has_oauth":true,"has_dcr":true,"has_prompts":false,"tool_count":25,"current_validation_schema_version":"8058defc70ca932c","last_validated_at":"2026-09-10T18:18:50.366194+00:00","registry_source":"awesome_mcp_servers","registry_identifier":"awesome_mcp_servers:Reachpad/reachpad-mcp","canonical_identifier":null,"current_score_components":{"auth_operability_score":4.0,"error_contract_score":1.0,"rate_limit_semantics_score":2.0,"schema_completeness_score":3.0,"backward_compatibility_score":4.0,"slo_health_score":3.0,"security_hygiene_score":4.0,"task_success_score":4.0,"trust_confidence_score":4.0,"abuse_noise_ratio_score":4.0,"prompt_contract_score":2.0,"resource_contract_score":2.0,"discovery_metadata_score":2.0,"registry_consistency_score":2.0,"installability_score":4.0,"session_semantics_score":4.0,"tool_surface_design_score":3.0,"result_shape_stability_score":3.0,"oauth_interop_score":4.0,"recovery_semantics_score":1.0,"maintenance_signal_score":3.0,"adoption_signal_score":2.0,"freshness_confidence_score":4.0,"transport_fidelity_score":4.0,"spec_recency_score":3.0,"session_resume_score":3.0,"step_up_auth_score":3.0,"transport_compliance_score":2.0,"utility_coverage_score":2.0,"advanced_capability_coverage_score":1.0,"connector_publishability_score":2.0,"tool_snapshot_churn_score":4.0,"connector_replay_score":4.0,"request_association_score":2.0,"interactive_flow_safety_score":4.0,"action_safety_score":2.0,"official_registry_presence_score":2.0,"safety_transparency_score":3.0,"tool_capability_clarity_score":4.0,"destructive_operation_safety_score":2.0,"egress_ssrf_resilience_score":3.0,"execution_sandbox_safety_score":4.0,"data_exfiltration_resilience_score":3.0,"least_privilege_scope_score":3.0,"secret_handling_hygiene_score":3.0,"dependency_supply_chain_signal_score":1.0,"input_sanitization_safety_score":3.0,"tool_namespace_clarity_score":4.0},"capability_taxonomy":[],"machine_summary":{},"taxonomy_tags":[],"score_decomposition":[],"validation_diff":null,"tool_snapshot_diff":null,"connector_replay":{},"request_association":{},"production_readiness":{"code":"safe_for_evaluation","label":"Safe for evaluation","reason":"The server is suitable for evaluation, but remaining gaps should be resolved before broad production use.","badge":"score-medium","critical_alerts":0,"high_or_critical_alerts":0,"degraded_by_active_alerts":false},"recommended_for":[],"history_summary":{},"validation_timeline":[],"evidence_confidence":{"score":100.0,"label":"high","reason":"Based on 20 recent validations, 22 captured checks, and validation age of 5.2 hours.","live_check_count":22,"validation_age_hours":5.21,"basis":{"evidence_bearing_validations":20,"affirmative_live_check_count":22,"validation_age_hours":5.21,"freshness_threshold_hours":24}},"incident_feed":[],"disputes":[],"remediations":[],"client_remediation_modes":[],"client_profiles":[],"client_readiness_verdicts":[],"publishability_policy_profiles":[],"compatibility_fixtures":[],"install_snippets":{},"aliases":[],"raw_evidence":{"checks":{"probe_noise_resilience":{"status":"ok","latency_ms":106.0,"details":{"url":"https://reachpad.dev/robots.txt","http_status":200,"headers":{"content-type":"text/plain; charset=utf-8","strict-transport-security":"max-age=63072000"},"validation_disallowed":false,"consent_error":null}},"server_card":{"status":"ok","latency_ms":173.76,"details":{"url":"https://reachpad.dev/.well-known/mcp/server-card.json","payload":{"name":"dev.reachpad/reachpad","title":"reachpad","description":"Publish the apps your coding agent builds and share each version by link.","version":"1.0.0","websiteUrl":"https://reachpad.dev","repository":{"url":"https://github.com/Reachpad/reachpad","source":"github"},"serverInfo":{"name":"reachpad","version":"1.0.0"},"protocolVersion":"2025-06-18","capabilities":{"tools":{"listChanged":false}},"tools":[{"name":"whoami","title":"Who am I","description":"Report the account and the organization this connection is signed in as: user id, email and name, plus org id and name, and `orgs`, every organization the account is in with the current one marked. Takes no arguments. Every app is created in the current organization and nowhere else, so call this before publishing when the person named an organization to publish into, and stop if the org id is not the one they named: switching is done at reachpad.dev/apps, from the organization name at the top of the sidebar, and this connection follows it.","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_apps","title":"Search apps","description":"Find apps in the caller's organization by text. This matches substrings of the name and the slug, and whole words on the live version's page, not meaning: search for a word that appears in the title or on the page rather than describing the app. Returns ids and live URLs.","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"Text to match against the name, the slug and the words on the live page."},"type":{"type":"string","enum":["app","page","doc","file"],"description":"Keep only apps carrying this badge."},"created_by":{"type":"string","description":"Keep only apps owned by this user id or email address."},"updated_by":{"type":"string","description":"Keep only apps owned by this user id or email address. Version authors are not indexed in v1, so this filters on the owner."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"How many rows to return. Defaults to 50."}},"required":[]}},{"name":"read_app","title":"Read an app","description":"Read one app before update_app: its name, type, access level and publishing mode, plus base_version_id and its files, which both describe the version the next edit builds on. Each text file carries its content, so this is how you see what an app already contains before changing it. A file marked content_omitted answer budget did not fit in this answer and read_app_file fetches it; one marked too large is past what any tool answer carries. Pass that base_version_id to update_app. version is what the link serves now, and head_version is the version base_version_id names on the apps where that is not the live one, which is every app with a version staged by publish false. pending_version is the number of that staged version, and publish_app_version is what makes it live.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."}},"required":["app_id"]}},{"name":"read_app_preview","title":"See an app","description":"Look at the picture of what an app's link serves right now, as an image. Use it for an app whose files you cannot read: a function app's module stays with the people who develop it, so this is how you see what the app actually shows. It is the live version only, and an app published before its picture was taken, or one whose capture has not run yet, answers that there is no picture rather than an error.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."}},"required":["app_id"]}},{"name":"list_app_versions","title":"List versions","description":"List an app's versions, newest first. Versions are immutable and numbered from 1. Earlier versions open for the app's editors; the live link follows the app's access setting. Pass the next_cursor from a previous call to get the next page.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"cursor":{"type":"string","description":"next_cursor from a previous call."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"How many rows to return. Defaults to 50."}},"required":["app_id"]}},{"name":"read_app_version","title":"Read a version","description":"Read one version by its number, with its files and each text file's content. Use it to see what an earlier publish contained, and to copy a file back out of a version you want to return to. Earlier versions open for the app's editors; the live link follows the app's access setting.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"number":{"type":"integer","minimum":1,"description":"The version number."}},"required":["app_id","number"]}},{"name":"read_app_file","title":"Read one file","description":"Read one file out of an app as text, at most 256 KB. Use it for a file that read_app left out with content_omitted: \"answer budget\", or to fetch a single file without the rest of the app. A file that is not text, and a text file over that size, are refused rather than truncated. Reads the newest version unless you name one, which is the same version read_app lists.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"path":{"type":"string","description":"The path inside the app, as it appears in read_app's files, for example index.html."},"number":{"type":"integer","minimum":1,"description":"The version number to read from. Defaults to the newest version."}},"required":["app_id","path"]}},{"name":"query_app_db","title":"Run one SQL statement","description":"Run one SQL statement against a function app's own database, to read rows and to fix data. Not for schema: a table or a column belongs in the version's migrations/NNNN_name.sql, and a statement that changes the schema is refused. Owners and editors only. Answers rows and rowCount for a select, and changes with lastInsertRowid for a write.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"sql":{"type":"string","description":"One statement, with ? placeholders for every value that comes from somewhere else. A second statement in the same string is refused."},"params":{"type":"array","description":"The values for the ? placeholders, in order. Strings, numbers, booleans and null.","items":{"type":["string","number","boolean","null"]}}},"required":["app_id","sql"]}},{"name":"list_secrets","title":"List secrets","description":"List the organization's secrets: each name, who set it, when, and the apps whose versions bind it. Names only. No tool anywhere returns a secret value.","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"set_secret","title":"Set a secret","description":"Set one organization secret, so a function can bind it by name in its manifest secrets list. Any member of the organization. Setting a name that already exists replaces the value and rotates it onto every published version that binds it. Answers the name, how many versions took the new value, and the ids of any that did not.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The environment variable name the function reads, for example STRIPE_SECRET_KEY. Letters, digits and underscores."},"value":{"type":"string","description":"The value. It is sealed on write: no tool returns it, this one included, and it is never written to a log or to this app's database. Ask the person to paste it themselves rather than repeating a key from earlier in the conversation."}},"required":["name","value"]}},{"name":"remove_secret","title":"Remove a secret","description":"Remove one organization secret and delete it from every published version that binds it. A version the deletion did not reach keeps the name in the list with that version in failed, and running this again retries exactly those.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The secret name, from list_secrets."}},"required":["name"]}},{"name":"trash_app","title":"Move an app to the trash","description":"Move an app to the trash. Its link stops opening at once. Owner only. The app and its versions are kept and can be restored from Trash at reachpad.dev/apps/trash, which is also the only place an app is deleted for good.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."}},"required":["app_id"]}},{"name":"create_app","title":"Publish a new app","description":"Publish new files as an app and get its URL back. Version 1 goes live at once, so show the person the content and the destination before calling this. Access defaults to org_link, which lets anyone signed in to the same organization open the link.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"What the app is called. Shown in listings."},"files":{"type":"array","description":"Files to publish as plain text, not base64: HTML, Markdown or JavaScript exporting default { fetch }. A page serves index.html at its URL. Functions declaring db include schema changes as migrations/NNNN_name.sql, run in order when the version goes live.","items":{"type":"object","properties":{"path":{"type":"string","description":"Path inside the app, relative and at most 100 bytes, for example index.html."},"content":{"type":"string","description":"The file's text."}},"required":["path","content"]}},"slug":{"type":"string","description":"The readable part of the subdomain to publish at, 3 to 34 characters of a-z, 0-9 and single hyphens. Derived from the name when omitted. A random 5-character tag is always appended, so a name is never taken and two apps may share one."},"type":{"type":"string","enum":["app","page","doc","file"],"description":"The badge on the row. Defaults to app."},"message":{"type":"string","description":"What version 1 contains."},"manifest":{"type":"object","description":"Omit on create_app for a static page; omit on update_app to keep the previous version's manifest. If supplied, replaces the entire manifest: include every field still needed. services, secrets and env apply only to functions. Runtime details and limits: https://reachpad.dev/SKILL.md","properties":{"kind":{"type":"string","enum":["page","function"],"description":"page serves files unchanged; function runs a JavaScript module for every request."},"entry":{"type":"string","description":"Root file for a page, usually index.html; module exporting default { fetch } for a function. Must exist in the resulting files, including files retained by merge."},"env":{"type":"object","description":"Plain strings bound as env.NAME, visible to anyone who can read the version. Put keys in secrets instead. Names shared with secrets fail publication."},"services":{"type":"array","items":{"type":"string","enum":["db","files"]},"description":"Function services: db binds the app's SQLite database at env.reachpad.db.query(sql, params) and env.reachpad.db.batch(statements); files binds its file store at env.reachpad.files.put/get/head/delete. Other names are refused. db permits migrations/NNNN_name.sql, run when the version goes live."},"secrets":{"type":"array","items":{"type":"string"},"description":"Organization secret names bound as env.NAME for functions. Set values first at reachpad.dev/apps/settings/secrets or with reachpad secrets set NAME. An unset name fails publication with NAME is not set."}},"required":[]},"access":{"type":"object","description":"Who may open the link. Defaults to org_link.","properties":{"level":{"type":"string","enum":["restricted","org_link","public_link"]}},"required":["level"]},"validate":{"type":"boolean","description":"Check without writing. Validates and returns the resulting file set, total bytes, entry and kind. create_app also validates the slug and returns it with the URL; <tag> stands for five random characters assigned on publish. Does not check the org app limit; publishing can still fail for that."}},"required":["name","files"]}},{"name":"update_app","title":"Publish a new version","description":"Publish a new version of an existing app. Read the app first and pass the base_version_id read_app returns: it names the version this edit builds on, and a base that has moved is refused rather than overwritten. By default the new version replaces the whole file set and goes live immediately unless the app is set to review before publishing. Send mode merge to publish only the files that changed and keep the rest of that version's files, with remove for paths to drop. Two merges in a row build on each other, staged versions included. Send validate true to check the call without publishing, or publish false to stage the version and make it live later with publish_app_version.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"files":{"type":"array","description":"Files to publish as plain text, not base64: HTML, Markdown or JavaScript exporting default { fetch }. A page serves index.html at its URL. Functions declaring db include schema changes as migrations/NNNN_name.sql, run in order when the version goes live.","items":{"type":"object","properties":{"path":{"type":"string","description":"Path inside the app, relative and at most 100 bytes, for example index.html."},"content":{"type":"string","description":"The file's text."}},"required":["path","content"]}},"base_version_id":{"type":"string","description":"The base_version_id read_app returned, which is the version this edit was made against. Starts with ver_."},"message":{"type":"string","description":"What changed in this version."},"manifest":{"type":"object","description":"Omit on create_app for a static page; omit on update_app to keep the previous version's manifest. If supplied, replaces the entire manifest: include every field still needed. services, secrets and env apply only to functions. Runtime details and limits: https://reachpad.dev/SKILL.md","properties":{"kind":{"type":"string","enum":["page","function"],"description":"page serves files unchanged; function runs a JavaScript module for every request."},"entry":{"type":"string","description":"Root file for a page, usually index.html; module exporting default { fetch } for a function. Must exist in the resulting files, including files retained by merge."},"env":{"type":"object","description":"Plain strings bound as env.NAME, visible to anyone who can read the version. Put keys in secrets instead. Names shared with secrets fail publication."},"services":{"type":"array","items":{"type":"string","enum":["db","files"]},"description":"Function services: db binds the app's SQLite database at env.reachpad.db.query(sql, params) and env.reachpad.db.batch(statements); files binds its file store at env.reachpad.files.put/get/head/delete. Other names are refused. db permits migrations/NNNN_name.sql, run when the version goes live."},"secrets":{"type":"array","items":{"type":"string"},"description":"Organization secret names bound as env.NAME for functions. Set values first at reachpad.dev/apps/settings/secrets or with reachpad secrets set NAME. An unset name fails publication with NAME is not set."}},"required":[]},"mode":{"type":"string","enum":["replace","merge"],"description":"replace, the default, publishes files as the whole file set: anything left out is gone. merge sends only the files that changed and carries every other file of the base version into the new version."},"remove":{"type":"array","items":{"type":"string"},"description":"Paths from the base version to leave out of the new one. Merge only, and a path that is not in the base version is refused rather than ignored. A call that only removes files sends an empty files array."},"validate":{"type":"boolean","description":"Check without writing. Validates and returns the resulting file set, total bytes, entry and kind. create_app also validates the slug and returns it with the URL; <tag> stands for five random characters assigned on publish. Does not check the org app limit; publishing can still fail for that."},"publish":{"type":"boolean","description":"false stages the version instead of putting it on the link. It is built and readable at its own version URL, and publish_app_version makes it live. Defaults to true."}},"required":["app_id","files","base_version_id"]}},{"name":"publish_app_version","title":"Make a version live","description":"Make one version of an app live by its number. This is how a version staged with publish false goes on the link, and how an app is rolled back: name an older number and that version is what the link serves again. Nothing is rebuilt, the pointer moves.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"number":{"type":"integer","minimum":1,"description":"The version number to make live."}},"required":["app_id","number"]}},{"name":"set_app_access","title":"Set who can open an app","description":"Change who can open an app: restricted (only the owner and named people), org_link (anyone signed in to the organization), or public_link (anyone with the URL). A password and an expiry apply to a public link only. Owner only.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"level":{"type":"string","enum":["restricted","org_link","public_link"]},"password":{"type":"string","description":"Set a password on a public link."},"clear_password":{"type":"boolean","description":"Remove the password."},"expires_at":{"type":"string","description":"RFC 3339 timestamp after which a public link stops working."},"clear_expiry":{"type":"boolean","description":"Remove the expiry."}},"required":["app_id","level"]}},{"name":"share_app","title":"Share an app","description":"Give one email address access to an app as a viewer or an editor. An address without an account gets a grant that starts working the first time they sign in. The owner or an editor may use this when the owner has enabled editor-managed sharing.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"email":{"type":"string","description":"The address to share with."},"role":{"type":"string","enum":["viewer","editor"],"description":"viewer can open it, editor can also publish versions."}},"required":["app_id","email","role"]}},{"name":"list_app_shares","title":"List shares","description":"List the people an app is shared with, their roles, and whether the grant has attached to an account yet. The owner and editors can read this list.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."}},"required":["app_id"]}},{"name":"revoke_app_share","title":"Remove a share","description":"Remove one share by its id, from list_app_shares. The app itself is untouched. The owner or an editor may use this when editor-managed sharing is enabled.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"share_id":{"type":"string","description":"The share id. Starts with shr_."}},"required":["app_id","share_id"]}},{"name":"ls","title":"List a folder","description":"List what is directly inside one folder: its subfolders and the apps filed in it. Omit folder_id for the top level. Each folder carries the updated_at that mv needs.","inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The folder to look inside. Omit for the top level."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"How many rows to return. Defaults to 50."}},"required":[]}},{"name":"tree","title":"Read the folder tree","description":"The whole folder tree for the organization, nested, with the number of apps filed in each folder and the count sitting at the top level. Each node carries the updated_at that mv needs.","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"mkdir","title":"Create a folder","description":"Create a folder, at the top level or inside another one.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The folder name."},"parent_id":{"type":"string","description":"The folder to create it inside. Omit for the top level."}},"required":["name"]}},{"name":"mv","title":"Move an app or folder","description":"Move an app into a folder, or move a folder under another folder. Name exactly one of app_id or folder_id as the thing being moved, and to_folder_id as the destination, or null for the top level. Moving a folder also needs base_updated_at, the value read from ls or tree, so a move made against a stale reading is refused instead of undoing someone else's.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app to move. Name this or folder_id, not both."},"folder_id":{"type":"string","description":"The folder to move. Name this or app_id, not both."},"to_folder_id":{"type":["string","null"],"description":"The destination folder id, or null to move to the top level."},"base_updated_at":{"type":"string","description":"The moved folder's updated_at, from ls or tree. Required when folder_id is given."}},"required":["to_folder_id"],"dependentRequired":{"folder_id":["base_updated_at"]}}},{"name":"rmdir","title":"Delete an empty folder","description":"Delete an empty folder. This refuses while the folder still holds apps or subfolders, and it never deletes an app. Move the contents out first.","inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The folder to delete."}},"required":["folder_id"]}},{"name":"get_app_logs","title":"Read app logs","description":"Read recent log lines from the live version of a function app. An app that serves files has no process and answers that it has no logs. Function logs are not captured yet either, and the answer says so: until they are, have the function catch its own errors and return them in the response.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"since":{"type":"string","description":"RFC 3339 timestamp to read from."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"How many rows to return. Defaults to 50."}},"required":["app_id"]}}],"transport":{"type":"streamable-http","url":"https://reachpad.dev/mcp"},"remotes":[{"type":"streamable-http","url":"https://reachpad.dev/mcp"}],"_meta":{"dev.reachpad/authorization":{"protectedResourceMetadata":"https://reachpad.dev/.well-known/oauth-protected-resource","authorizationServers":["https://splendid-experience-99.authkit.app"],"dynamicClientRegistration":true,"documentation":"https://reachpad.dev/auth.md"}}},"http_status":200,"headers":{"content-type":"application/json","set-cookie":"rp_ft=%7B%22p%22%3A%22%2F.well-known%2Fmcp%2Fserver-card.json%22%2C%22t%22%3A%222026-09-10T18%3A18%3A48.284Z%22%7D; Path=/; Max-Age=7776000; HttpOnly; SameSite=Lax; Secure, rp_anon=anon_6b38a5639bc24d64; Path=/; Max-Age=2592000; HttpOnly; SameSite=Lax; Secure","strict-transport-security":"max-age=63072000"}}},"oauth_protected_resource":{"status":"ok","latency_ms":392.98,"details":{"url":"https://reachpad.dev/.well-known/oauth-protected-resource","payload":{"resource":"https://reachpad.dev/mcp","authorization_servers":["https://splendid-experience-99.authkit.app"],"bearer_methods_supported":["header"],"scopes_supported":["openid","profile","email","offline_access"],"resource_documentation":"https://reachpad.dev/docs","jwks_uri":"https://splendid-experience-99.authkit.app/oauth2/jwks"},"http_status":200,"headers":{"content-type":"application/json","strict-transport-security":"max-age=63072000"}}},"oauth_authorization_server":{"status":"ok","latency_ms":111.08,"details":{"url":"https://splendid-experience-99.authkit.app/.well-known/oauth-authorization-server","payload":{"authorization_endpoint":"https://splendid-experience-99.authkit.app/oauth2/authorize","client_id_metadata_document_supported":true,"code_challenge_methods_supported":["S256"],"device_authorization_endpoint":"https://splendid-experience-99.authkit.app/oauth2/device_authorization","grant_types_supported":["authorization_code","refresh_token","urn:ietf:params:oauth:grant-type:device_code"],"introspection_endpoint":"https://splendid-experience-99.authkit.app/oauth2/introspection","issuer":"https://splendid-experience-99.authkit.app","jwks_uri":"https://splendid-experience-99.authkit.app/oauth2/jwks","registration_endpoint":"https://splendid-experience-99.authkit.app/oauth2/register","scopes_supported":["email","offline_access","openid","profile"],"response_modes_supported":["query"],"response_types_supported":["code"],"token_endpoint":"https://splendid-experience-99.authkit.app/oauth2/token","token_endpoint_auth_methods_supported":["none","client_secret_post","client_secret_basic"]},"http_status":200,"headers":{"content-type":"application/json; charset=utf-8","strict-transport-security":"max-age=31536000; includeSubDomains; preload","set-cookie":"__cf_bm=4IiMeKB1lCCcf6uA7zhh5qGDbEM.vO_NnuvlJbVPOEs-1789064328.7980013-1.0.1.1-AJPiCcUyOUoNCYR.aR5JrRxjaPWEDGjv1V8zPgfUmthR0KX9qIWOPdIylu2zS.vfFQihRpDEbjtJ3WAu8vgLG.oVJ.sUzj8KhUB3jjzPm.qEYYTHUIRGMED4IcXAXD9e; HttpOnly; SameSite=None; Secure; Path=/; Domain=authkit.app; Expires=Thu, 10 Sep 2026 18:48:48 GMT"}}},"openid_configuration":{"status":"ok","latency_ms":123.97,"details":{"url":"https://splendid-experience-99.authkit.app/.well-known/openid-configuration","payload":{"issuer":"https://splendid-experience-99.authkit.app","authorization_endpoint":"https://splendid-experience-99.authkit.app/oauth2/authorize","device_authorization_endpoint":"https://splendid-experience-99.authkit.app/oauth2/device_authorization","grant_types_supported":["authorization_code","client_credentials","refresh_token","urn:ietf:params:oauth:grant-type:device_code"],"id_token_signing_alg_values_supported":["RS256"],"introspection_endpoint":"https://splendid-experience-99.authkit.app/oauth2/introspection","jwks_uri":"https://splendid-experience-99.authkit.app/oauth2/jwks","response_types_supported":["code"],"scopes_supported":["email","offline_access","openid","profile"],"subject_types_supported":["public"],"token_endpoint":"https://splendid-experience-99.authkit.app/oauth2/token","token_endpoint_auth_methods_supported":["none","client_secret_basic","client_secret_post"],"userinfo_endpoint":"https://splendid-experience-99.authkit.app/oauth2/userinfo"},"http_status":200,"headers":{"content-type":"application/json; charset=utf-8","set-cookie":"__cf_bm=soWvvA65NqtUzDVfQIcuxJm8xW.QSCz6T3UirqMcQUY-1789064328.926504-1.0.1.1-c16hMF.KFgvQMYf2fKZDBjtw74VM5_V9ceiEBbZwThDVApkOOZ1h7cRirumWTCbqpXI6mguFxf8Bqb0fZsfH0jfk73pMznTTEsSddK7WeC9ZObyJZeOSOuRWQVEw2ROh; HttpOnly; SameSite=None; Secure; Path=/; Domain=workos.com; Expires=Thu, 10 Sep 2026 18:48:48 GMT","strict-transport-security":"max-age=31536000; includeSubDomains; preload"}}},"initialize":{"status":"ok","latency_ms":85.99,"details":{"url":"https://reachpad.dev/mcp","payload":{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{"listChanged":false}},"serverInfo":{"name":"reachpad","version":"1.0.0"},"instructions":"This reachpad connection is NOT authenticated: the tools below can be read but none of them can be called. Every tools/call answers 401 until the connection is authorized through https://reachpad.dev/.well-known/oauth-protected-resource. Say that before attempting a tool, rather than reporting the tool as broken."}},"http_status":200,"headers":{"content-type":"application/json","strict-transport-security":"max-age=63072000"}}},"protocol_version_probe":{"status":"warning","latency_ms":null,"details":{"claimed_version":"2025-06-18","validator_protocol_version":"2025-03-26","latest_known_version":"2025-11-25","releases_behind":1,"lag_days":160}},"tools_list":{"status":"ok","latency_ms":82.45,"details":{"url":"https://reachpad.dev/mcp","payload":{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"whoami","annotations":{"title":"Who am I","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"Report the account and the organization this connection is signed in as: user id, email and name, plus org id and name, and `orgs`, every organization the account is in with the current one marked. Takes no arguments. Every app is created in the current organization and nowhere else, so call this before publishing when the person named an organization to publish into, and stop if the org id is not the one they named: switching is done at reachpad.dev/apps, from the organization name at the top of the sidebar, and this connection follows it.","inputSchema":{"type":"object","properties":{},"required":[]},"title":"Who am I"},{"name":"search_apps","annotations":{"title":"Search apps","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"Find apps in the caller's organization by text. This matches substrings of the name and the slug, and whole words on the live version's page, not meaning: search for a word that appears in the title or on the page rather than describing the app. Returns ids and live URLs.","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"Text to match against the name, the slug and the words on the live page."},"type":{"type":"string","enum":["app","page","doc","file"],"description":"Keep only apps carrying this badge."},"created_by":{"type":"string","description":"Keep only apps owned by this user id or email address."},"updated_by":{"type":"string","description":"Keep only apps owned by this user id or email address. Version authors are not indexed in v1, so this filters on the owner."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"How many rows to return. Defaults to 50."}},"required":[]},"title":"Search apps"},{"name":"read_app","annotations":{"title":"Read an app","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"Read one app before update_app: its name, type, access level and publishing mode, plus base_version_id and its files, which both describe the version the next edit builds on. Each text file carries its content, so this is how you see what an app already contains before changing it. A file marked content_omitted answer budget did not fit in this answer and read_app_file fetches it; one marked too large is past what any tool answer carries. Pass that base_version_id to update_app. version is what the link serves now, and head_version is the version base_version_id names on the apps where that is not the live one, which is every app with a version staged by publish false. pending_version is the number of that staged version, and publish_app_version is what makes it live.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."}},"required":["app_id"]},"title":"Read an app"},{"name":"read_app_preview","annotations":{"title":"See an app","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"Look at the picture of what an app's link serves right now, as an image. Use it for an app whose files you cannot read: a function app's module stays with the people who develop it, so this is how you see what the app actually shows. It is the live version only, and an app published before its picture was taken, or one whose capture has not run yet, answers that there is no picture rather than an error.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."}},"required":["app_id"]},"title":"See an app"},{"name":"list_app_versions","annotations":{"title":"List versions","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"List an app's versions, newest first. Versions are immutable and numbered from 1. Earlier versions open for the app's editors; the live link follows the app's access setting. Pass the next_cursor from a previous call to get the next page.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"cursor":{"type":"string","description":"next_cursor from a previous call."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"How many rows to return. Defaults to 50."}},"required":["app_id"]},"title":"List versions"},{"name":"read_app_version","annotations":{"title":"Read a version","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"Read one version by its number, with its files and each text file's content. Use it to see what an earlier publish contained, and to copy a file back out of a version you want to return to. Earlier versions open for the app's editors; the live link follows the app's access setting.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"number":{"type":"integer","minimum":1,"description":"The version number."}},"required":["app_id","number"]},"title":"Read a version"},{"name":"read_app_file","annotations":{"title":"Read one file","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"Read one file out of an app as text, at most 256 KB. Use it for a file that read_app left out with content_omitted: \"answer budget\", or to fetch a single file without the rest of the app. A file that is not text, and a text file over that size, are refused rather than truncated. Reads the newest version unless you name one, which is the same version read_app lists.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"path":{"type":"string","description":"The path inside the app, as it appears in read_app's files, for example index.html."},"number":{"type":"integer","minimum":1,"description":"The version number to read from. Defaults to the newest version."}},"required":["app_id","path"]},"title":"Read one file"},{"name":"query_app_db","annotations":{"title":"Run one SQL statement","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"description":"Run one SQL statement against a function app's own database, to read rows and to fix data. Not for schema: a table or a column belongs in the version's migrations/NNNN_name.sql, and a statement that changes the schema is refused. Owners and editors only. Answers rows and rowCount for a select, and changes with lastInsertRowid for a write.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"sql":{"type":"string","description":"One statement, with ? placeholders for every value that comes from somewhere else. A second statement in the same string is refused."},"params":{"type":"array","description":"The values for the ? placeholders, in order. Strings, numbers, booleans and null.","items":{"type":["string","number","boolean","null"]}}},"required":["app_id","sql"]},"title":"Run one SQL statement"},{"name":"list_secrets","annotations":{"title":"List secrets","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"List the organization's secrets: each name, who set it, when, and the apps whose versions bind it. Names only. No tool anywhere returns a secret value.","inputSchema":{"type":"object","properties":{},"required":[]},"title":"List secrets"},{"name":"set_secret","annotations":{"title":"Set a secret","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"description":"Set one organization secret, so a function can bind it by name in its manifest secrets list. Any member of the organization. Setting a name that already exists replaces the value and rotates it onto every published version that binds it. Answers the name, how many versions took the new value, and the ids of any that did not.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The environment variable name the function reads, for example STRIPE_SECRET_KEY. Letters, digits and underscores."},"value":{"type":"string","description":"The value. It is sealed on write: no tool returns it, this one included, and it is never written to a log or to this app's database. Ask the person to paste it themselves rather than repeating a key from earlier in the conversation."}},"required":["name","value"]},"title":"Set a secret"},{"name":"remove_secret","annotations":{"title":"Remove a secret","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"description":"Remove one organization secret and delete it from every published version that binds it. A version the deletion did not reach keeps the name in the list with that version in failed, and running this again retries exactly those.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The secret name, from list_secrets."}},"required":["name"]},"title":"Remove a secret"},{"name":"trash_app","annotations":{"title":"Move an app to the trash","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"description":"Move an app to the trash. Its link stops opening at once. Owner only. The app and its versions are kept and can be restored from Trash at reachpad.dev/apps/trash, which is also the only place an app is deleted for good.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."}},"required":["app_id"]},"title":"Move an app to the trash"},{"name":"create_app","annotations":{"title":"Publish a new app","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"description":"Publish new files as an app and get its URL back. Version 1 goes live at once, so show the person the content and the destination before calling this. Access defaults to org_link, which lets anyone signed in to the same organization open the link.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"What the app is called. Shown in listings."},"files":{"type":"array","description":"Files to publish as plain text, not base64: HTML, Markdown or JavaScript exporting default { fetch }. A page serves index.html at its URL. Functions declaring db include schema changes as migrations/NNNN_name.sql, run in order when the version goes live.","items":{"type":"object","properties":{"path":{"type":"string","description":"Path inside the app, relative and at most 100 bytes, for example index.html."},"content":{"type":"string","description":"The file's text."}},"required":["path","content"]}},"slug":{"type":"string","description":"The readable part of the subdomain to publish at, 3 to 34 characters of a-z, 0-9 and single hyphens. Derived from the name when omitted. A random 5-character tag is always appended, so a name is never taken and two apps may share one."},"type":{"type":"string","enum":["app","page","doc","file"],"description":"The badge on the row. Defaults to app."},"message":{"type":"string","description":"What version 1 contains."},"manifest":{"type":"object","description":"Omit on create_app for a static page; omit on update_app to keep the previous version's manifest. If supplied, replaces the entire manifest: include every field still needed. services, secrets and env apply only to functions. Runtime details and limits: https://reachpad.dev/SKILL.md","properties":{"kind":{"type":"string","enum":["page","function"],"description":"page serves files unchanged; function runs a JavaScript module for every request."},"entry":{"type":"string","description":"Root file for a page, usually index.html; module exporting default { fetch } for a function. Must exist in the resulting files, including files retained by merge."},"env":{"type":"object","description":"Plain strings bound as env.NAME, visible to anyone who can read the version. Put keys in secrets instead. Names shared with secrets fail publication."},"services":{"type":"array","items":{"type":"string","enum":["db","files"]},"description":"Function services: db binds the app's SQLite database at env.reachpad.db.query(sql, params) and env.reachpad.db.batch(statements); files binds its file store at env.reachpad.files.put/get/head/delete. Other names are refused. db permits migrations/NNNN_name.sql, run when the version goes live."},"secrets":{"type":"array","items":{"type":"string"},"description":"Organization secret names bound as env.NAME for functions. Set values first at reachpad.dev/apps/settings/secrets or with reachpad secrets set NAME. An unset name fails publication with NAME is not set."}},"required":[]},"access":{"type":"object","description":"Who may open the link. Defaults to org_link.","properties":{"level":{"type":"string","enum":["restricted","org_link","public_link"]}},"required":["level"]},"validate":{"type":"boolean","description":"Check without writing. Validates and returns the resulting file set, total bytes, entry and kind. create_app also validates the slug and returns it with the URL; <tag> stands for five random characters assigned on publish. Does not check the org app limit; publishing can still fail for that."}},"required":["name","files"]},"title":"Publish a new app"},{"name":"update_app","annotations":{"title":"Publish a new version","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"description":"Publish a new version of an existing app. Read the app first and pass the base_version_id read_app returns: it names the version this edit builds on, and a base that has moved is refused rather than overwritten. By default the new version replaces the whole file set and goes live immediately unless the app is set to review before publishing. Send mode merge to publish only the files that changed and keep the rest of that version's files, with remove for paths to drop. Two merges in a row build on each other, staged versions included. Send validate true to check the call without publishing, or publish false to stage the version and make it live later with publish_app_version.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"files":{"type":"array","description":"Files to publish as plain text, not base64: HTML, Markdown or JavaScript exporting default { fetch }. A page serves index.html at its URL. Functions declaring db include schema changes as migrations/NNNN_name.sql, run in order when the version goes live.","items":{"type":"object","properties":{"path":{"type":"string","description":"Path inside the app, relative and at most 100 bytes, for example index.html."},"content":{"type":"string","description":"The file's text."}},"required":["path","content"]}},"base_version_id":{"type":"string","description":"The base_version_id read_app returned, which is the version this edit was made against. Starts with ver_."},"message":{"type":"string","description":"What changed in this version."},"manifest":{"type":"object","description":"Omit on create_app for a static page; omit on update_app to keep the previous version's manifest. If supplied, replaces the entire manifest: include every field still needed. services, secrets and env apply only to functions. Runtime details and limits: https://reachpad.dev/SKILL.md","properties":{"kind":{"type":"string","enum":["page","function"],"description":"page serves files unchanged; function runs a JavaScript module for every request."},"entry":{"type":"string","description":"Root file for a page, usually index.html; module exporting default { fetch } for a function. Must exist in the resulting files, including files retained by merge."},"env":{"type":"object","description":"Plain strings bound as env.NAME, visible to anyone who can read the version. Put keys in secrets instead. Names shared with secrets fail publication."},"services":{"type":"array","items":{"type":"string","enum":["db","files"]},"description":"Function services: db binds the app's SQLite database at env.reachpad.db.query(sql, params) and env.reachpad.db.batch(statements); files binds its file store at env.reachpad.files.put/get/head/delete. Other names are refused. db permits migrations/NNNN_name.sql, run when the version goes live."},"secrets":{"type":"array","items":{"type":"string"},"description":"Organization secret names bound as env.NAME for functions. Set values first at reachpad.dev/apps/settings/secrets or with reachpad secrets set NAME. An unset name fails publication with NAME is not set."}},"required":[]},"mode":{"type":"string","enum":["replace","merge"],"description":"replace, the default, publishes files as the whole file set: anything left out is gone. merge sends only the files that changed and carries every other file of the base version into the new version."},"remove":{"type":"array","items":{"type":"string"},"description":"Paths from the base version to leave out of the new one. Merge only, and a path that is not in the base version is refused rather than ignored. A call that only removes files sends an empty files array."},"validate":{"type":"boolean","description":"Check without writing. Validates and returns the resulting file set, total bytes, entry and kind. create_app also validates the slug and returns it with the URL; <tag> stands for five random characters assigned on publish. Does not check the org app limit; publishing can still fail for that."},"publish":{"type":"boolean","description":"false stages the version instead of putting it on the link. It is built and readable at its own version URL, and publish_app_version makes it live. Defaults to true."}},"required":["app_id","files","base_version_id"]},"title":"Publish a new version"},{"name":"publish_app_version","annotations":{"title":"Make a version live","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"description":"Make one version of an app live by its number. This is how a version staged with publish false goes on the link, and how an app is rolled back: name an older number and that version is what the link serves again. Nothing is rebuilt, the pointer moves.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"number":{"type":"integer","minimum":1,"description":"The version number to make live."}},"required":["app_id","number"]},"title":"Make a version live"},{"name":"set_app_access","annotations":{"title":"Set who can open an app","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"description":"Change who can open an app: restricted (only the owner and named people), org_link (anyone signed in to the organization), or public_link (anyone with the URL). A password and an expiry apply to a public link only. Owner only.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"level":{"type":"string","enum":["restricted","org_link","public_link"]},"password":{"type":"string","description":"Set a password on a public link."},"clear_password":{"type":"boolean","description":"Remove the password."},"expires_at":{"type":"string","description":"RFC 3339 timestamp after which a public link stops working."},"clear_expiry":{"type":"boolean","description":"Remove the expiry."}},"required":["app_id","level"]},"title":"Set who can open an app"},{"name":"share_app","annotations":{"title":"Share an app","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"description":"Give one email address access to an app as a viewer or an editor. An address without an account gets a grant that starts working the first time they sign in. The owner or an editor may use this when the owner has enabled editor-managed sharing.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"email":{"type":"string","description":"The address to share with."},"role":{"type":"string","enum":["viewer","editor"],"description":"viewer can open it, editor can also publish versions."}},"required":["app_id","email","role"]},"title":"Share an app"},{"name":"list_app_shares","annotations":{"title":"List shares","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"List the people an app is shared with, their roles, and whether the grant has attached to an account yet. The owner and editors can read this list.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."}},"required":["app_id"]},"title":"List shares"},{"name":"revoke_app_share","annotations":{"title":"Remove a share","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"description":"Remove one share by its id, from list_app_shares. The app itself is untouched. The owner or an editor may use this when editor-managed sharing is enabled.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"share_id":{"type":"string","description":"The share id. Starts with shr_."}},"required":["app_id","share_id"]},"title":"Remove a share"},{"name":"ls","annotations":{"title":"List a folder","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"List what is directly inside one folder: its subfolders and the apps filed in it. Omit folder_id for the top level. Each folder carries the updated_at that mv needs.","inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The folder to look inside. Omit for the top level."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"How many rows to return. Defaults to 50."}},"required":[]},"title":"List a folder"},{"name":"tree","annotations":{"title":"Read the folder tree","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"The whole folder tree for the organization, nested, with the number of apps filed in each folder and the count sitting at the top level. Each node carries the updated_at that mv needs.","inputSchema":{"type":"object","properties":{},"required":[]},"title":"Read the folder tree"},{"name":"mkdir","annotations":{"title":"Create a folder","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"description":"Create a folder, at the top level or inside another one.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The folder name."},"parent_id":{"type":"string","description":"The folder to create it inside. Omit for the top level."}},"required":["name"]},"title":"Create a folder"},{"name":"mv","annotations":{"title":"Move an app or folder","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"description":"Move an app into a folder, or move a folder under another folder. Name exactly one of app_id or folder_id as the thing being moved, and to_folder_id as the destination, or null for the top level. Moving a folder also needs base_updated_at, the value read from ls or tree, so a move made against a stale reading is refused instead of undoing someone else's.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app to move. Name this or folder_id, not both."},"folder_id":{"type":"string","description":"The folder to move. Name this or app_id, not both."},"to_folder_id":{"type":["string","null"],"description":"The destination folder id, or null to move to the top level."},"base_updated_at":{"type":"string","description":"The moved folder's updated_at, from ls or tree. Required when folder_id is given."}},"required":["to_folder_id"],"dependentRequired":{"folder_id":["base_updated_at"]}},"title":"Move an app or folder"},{"name":"rmdir","annotations":{"title":"Delete an empty folder","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"description":"Delete an empty folder. This refuses while the folder still holds apps or subfolders, and it never deletes an app. Move the contents out first.","inputSchema":{"type":"object","properties":{"folder_id":{"type":"string","description":"The folder to delete."}},"required":["folder_id"]},"title":"Delete an empty folder"},{"name":"get_app_logs","annotations":{"title":"Read app logs","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"description":"Read recent log lines from the live version of a function app. An app that serves files has no process and answers that it has no logs. Function logs are not captured yet either, and the answer says so: until they are, have the function catch its own errors and return them in the response.","inputSchema":{"type":"object","properties":{"app_id":{"type":"string","description":"The app id, as returned by search_apps or create_app. Starts with app_."},"since":{"type":"string","description":"RFC 3339 timestamp to read from."},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"How many rows to return. Defaults to 50."}},"required":["app_id"]},"title":"Read app logs"}]}},"http_status":200,"headers":{"content-type":"application/json","strict-transport-security":"max-age=63072000"}}},"prompts_list":{"status":"auth_required","latency_ms":50.62,"details":{"url":"https://reachpad.dev/mcp","error":"Client error '401 Unauthorized' for url 'https://reachpad.dev/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401","http_status":401,"payload":{},"headers":{"content-type":"application/json","strict-transport-security":"max-age=63072000","www-authenticate":"Bearer resource_metadata=\"https://reachpad.dev/.well-known/oauth-protected-resource\", error=\"invalid_token\", error_description=\"no bearer token\""},"reason":"auth_required"}},"prompt_get":{"status":"missing","latency_ms":null,"details":{"reason":"not_advertised"}},"resources_list":{"status":"auth_required","latency_ms":143.1,"details":{"url":"https://reachpad.dev/mcp","error":"Client error '401 Unauthorized' for url 'https://reachpad.dev/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401","http_status":401,"payload":{},"headers":{"content-type":"application/json","strict-transport-security":"max-age=63072000","www-authenticate":"Bearer resource_metadata=\"https://reachpad.dev/.well-known/oauth-protected-resource\", error=\"invalid_token\", error_description=\"no bearer token\""},"reason":"auth_required"}},"resource_read":{"status":"missing","latency_ms":null,"details":{"reason":"not_advertised"}},"determinism_probe":{"status":"ok","latency_ms":145.8,"details":{"attempts":2,"successful":2,"matches":2,"stable_ratio":1.0,"baseline_signature":"850d290898a4b3d334c605068b34b48512ab116fa1b16f5fe3ede570e4f48543","errors":[]}},"instruction_tool_reference_probe":{"status":"warning","latency_ms":null,"details":{"referenced_tools":["answers"],"missing_tools":["answers"],"observed_tool_count":25}},"session_resume_probe":{"status":"warning","latency_ms":null,"details":{"reason":"no_session_id","transport":"streamable-http","resume_expected":true,"protocol_version":"2025-06-18"}},"step_up_auth_probe":{"status":"warning","latency_ms":null,"details":{"oauth_present":true,"auth_required_checks":["prompts_list","resources_list"],"supported_scopes":["email","offline_access","openid","profile"],"scope_specificity_ratio":0.2,"broad_scopes":[],"challenge_headers":["Bearer resource_metadata=\"https://reachpad.dev/.well-known/oauth-protected-resource\", error=\"invalid_token\", error_description=\"no bearer token\"","Bearer resource_metadata=\"https://reachpad.dev/.well-known/oauth-protected-resource\", error=\"invalid_token\", error_description=\"no bearer token\""],"step_up_signals":["Bearer resource_metadata=\"https://reachpad.dev/.well-known/oauth-protected-resource\", error=\"invalid_token\", error_description=\"no bearer token\"","Bearer resource_metadata=\"https://reachpad.dev/.well-known/oauth-protected-resource\", error=\"invalid_token\", error_description=\"no bearer token\""],"minimal_scope_documented":false}},"transport_compliance_probe":{"status":"warning","latency_ms":70.85,"details":{"transport":"streamable-http","session_id_present":false,"protocol_header_present":false,"last_event_id_visible":false,"requested_protocol_version":"2025-06-18","bad_protocol_status_code":400,"bad_protocol_payload":{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"MCP-Protocol-Version must be 2025-06-18"}},"bad_protocol_headers":{"content-type":"application/json","strict-transport-security":"max-age=63072000"},"bad_protocol_error":null,"delete_status_code":null,"delete_error":null,"expired_session_status_code":null,"expired_session_error":null,"issues":["missing_session_id","missing_protocol_header"]}},"utility_coverage_probe":{"status":"ok","latency_ms":70.65,"details":{"completions":{"advertised":false,"sample_target":null,"live_probe":"not_executed"},"pagination":{"supported":true,"next_cursor_methods":[],"metadata_signal":true},"tasks":{"advertised":false,"probe_status":"auth_required","http_status":401},"initialize_capability_keys":["tools"]}},"advanced_capabilities_probe":{"status":"warning","latency_ms":null,"details":{"capabilities":{"prompts":true,"resources":true,"completions":false,"roots":true,"sampling":false,"elicitation":false,"structured_outputs":false,"resource_links":false},"enabled_count":3,"enabled":["prompts","resources","roots"],"initialize_capability_keys":["tools"]}},"tool_snapshot_probe":{"status":"ok","latency_ms":null,"details":{"current_tool_count":25,"previous_tool_count":25,"similarity":1.0,"added":[],"removed":[],"changed_outputs":[]}},"connector_replay_probe":{"status":"ok","latency_ms":null,"details":{"backward_compatible":true,"would_break_after_refresh":false,"added_tools":[],"removed_tools":[],"required_arg_breaks":[],"output_breaks":[],"additive_output_changes":[]}},"request_association_probe":{"status":"warning","latency_ms":null,"details":{"reason":"no_session_id_for_idle_observation","advertised_capabilities":["roots"],"protocol_version":"2025-06-18"}},"interactive_flow_probe":{"status":"ok","latency_ms":null,"details":{"risk_hits":[],"safe_hits":["oauth","sign in"],"oauth_supported":true,"prompt_available":false}},"action_safety_probe":{"status":"warning","latency_ms":null,"details":{"summary":{"tool_count":25,"high_risk_tools":1,"destructive_tools":5,"exec_tools":0,"egress_tools":0,"secret_tools":1,"bulk_access_tools":1,"declared_non_read_only_tools":13,"annotation_conflict_tools":0,"risk_distribution":{"low":14,"medium":10,"high":1,"critical":0},"capability_distribution":{"read":12,"export":1,"filesystem":4,"write":9,"delete":5,"undetermined":2,"secrets":1},"has_mutating_capability":true,"has_non_read_capability":true},"auth_present":true,"safeguard_count":1,"confirmation_signals":["read_app_preview","mv"],"reason":null}},"official_registry_probe":{"status":"missing","latency_ms":null,"details":{"registry_source":"awesome_mcp_servers","direct_match":false,"official_peer_count":0}},"provenance_divergence_probe":{"status":"not_assessed","latency_ms":null,"details":{"direct_official_match":false,"registry_title":null,"server_card_title":"reachpad","registry_version":null,"server_card_version":"1.0.0","registry_homepage":null,"server_card_homepage":null,"registry_repository":null,"server_card_repository":"https://github.com/Reachpad/reachpad","drift_fields":[],"metadata_document_count":2,"compared_fields":["title","version","homepage","repository"],"readable_sources":["server_card"],"comparable_field_count":0}},"schema_divergence_probe":{"status":"ok","latency_ms":null,"details":{"severity":null,"compared_tool_count":25,"tools_missing_from_live":[],"tools_missing_from_card":[],"tool_divergences":[],"tools_with_omitted_schema":[],"compared_dimensions":["server_name","server_version","declared_vs_observed_auth","tool_membership","parameter_names","required_parameters","parameter_types","output_schema_presence"],"server_name_mismatch":false,"card_server_name":"reachpad","live_server_name":"reachpad","server_version_mismatch":false,"card_server_version":"1.0.0","live_server_version":"1.0.0","auth_scheme_mismatch":false,"card_auth_schemes":[],"live_oauth_observed":true}},"connector_publishability_probe":{"status":"warning","latency_ms":null,"details":{"transport":"streamable-http","tool_count":25,"high_risk_tools":1,"blockers":["protocol_version","session_resume","step_up_auth","transport_compliance","request_association","action_safety"],"criteria":{"remote_transport":true,"initialize":true,"tools_list":true,"protocol_version":false,"session_resume":false,"step_up_auth":false,"transport_compliance":false,"connector_replay":true,"request_association":false,"action_safety":false,"server_card":true,"tool_surface":true,"auth_flow":true}}}}},"active_alerts":[{"code":"instruction_tool_reference_mismatch","severity":"low","title":"Server instructions name unavailable tools","message":"Initialize instructions reference tools not present in tools/list: answers","addressee":"publisher"}],"maintainer_analytics":{},"public_server_reputation":{},"maintainer_response_quality":{},"maintainer_annotations":[],"maintainer_rebuttals":[],"security_posture_summary":{},"tool_security_inventory":[],"transport_compliance":{},"utility_coverage":{},"write_action_governance":{},"provenance_divergence":{},"alias_consolidation":{},"alert_routing":{},"authenticated_validation":{},"hosted_runtime":{},"action_controls_diff":null,"benchmark_tasks":[],"latest_capability_counts":{},"point_loss_breakdown":[],"verdict_traces":{},"current_snapshot":{"schema_version":"verify.trust_snapshot.v1","snapshot_id":"trustsnap_5dbb19f121d77c74","generated_at":"2026-09-10T23:31:40.042807+00:00","trust_evaluated_at":"2026-09-10T23:31:40.042807+00:00","evidence_revision":"f19100d7c828b319217297b0","source":"current_snapshot","server":"awesome-reachpad/reachpad-mcp","last_validated_at":"2026-09-10T18:18:50.366194+00:00","validation_age_hours":5.21,"freshness":{"schema_version":"verify.freshness_profile.v1","last_validated_at":"2026-09-10T18:18:50.366194+00:00","age_hours":5.21,"bucket":"verified_last_24h","label":"Verified in last 24h","badges":["verified_last_24h"],"freshness_sla_hours":720.0,"freshness_sla_status":"met","stale_score_suppressed":false,"display_score":72.92,"raw_score":72.92,"confidence_score":100.0,"confidence_weighted_score":72.9,"tier_status":[{"tier":"community","label":"Community","freshness_sla_hours":720,"met":true,"priority_revalidation":false},{"tier":"pro","label":"Pro","freshness_sla_hours":168,"met":true,"priority_revalidation":true},{"tier":"enterprise","label":"Enterprise","freshness_sla_hours":24,"met":true,"priority_revalidation":true}]},"current_status":"healthy","current_score":72.92,"display_score":72.92,"stale_score_suppressed":false,"production_trust_decision":{"schema_version":"verify.executive_verdict.v1","decision":"Allow with approval","why":"write/admin actions need confirmation safeguards + unauthenticated behavior not proven","next_action":"export policy, require approval for writes, add authenticated validation","reason_count":2},"production_readiness_class":{"code":"safe_for_evaluation","label":"Safe for evaluation","reason":"The server is suitable for evaluation, but remaining gaps should be resolved before broad production use."},"evidence_confidence":{"score":100.0,"label":"high","validation_age_hours":5.21,"live_check_count":22,"basis":{"evidence_bearing_validations":20,"affirmative_live_check_count":22,"validation_age_hours":5.21,"freshness_threshold_hours":24}},"active_alerts":[{"code":"instruction_tool_reference_mismatch","severity":"low","title":"Server instructions name unavailable tools"}],"active_alert_summary":{"critical":0,"high":0,"medium":0,"low":1,"high_or_critical":0,"total":1},"materialization":{"state":"partial","trust_core_complete":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"materialized_at":"2026-09-10T23:31:40.042807+00:00"}},"trust_snapshot":{"schema_version":"verify.trust_snapshot.v1","snapshot_id":"trustsnap_5dbb19f121d77c74","generated_at":"2026-09-10T23:31:40.042807+00:00","trust_evaluated_at":"2026-09-10T23:31:40.042807+00:00","evidence_revision":"f19100d7c828b319217297b0","source":"current_snapshot","server":"awesome-reachpad/reachpad-mcp","last_validated_at":"2026-09-10T18:18:50.366194+00:00","validation_age_hours":5.21,"freshness":{"schema_version":"verify.freshness_profile.v1","last_validated_at":"2026-09-10T18:18:50.366194+00:00","age_hours":5.21,"bucket":"verified_last_24h","label":"Verified in last 24h","badges":["verified_last_24h"],"freshness_sla_hours":720.0,"freshness_sla_status":"met","stale_score_suppressed":false,"display_score":72.92,"raw_score":72.92,"confidence_score":100.0,"confidence_weighted_score":72.9,"tier_status":[{"tier":"community","label":"Community","freshness_sla_hours":720,"met":true,"priority_revalidation":false},{"tier":"pro","label":"Pro","freshness_sla_hours":168,"met":true,"priority_revalidation":true},{"tier":"enterprise","label":"Enterprise","freshness_sla_hours":24,"met":true,"priority_revalidation":true}]},"current_status":"healthy","current_score":72.92,"display_score":72.92,"stale_score_suppressed":false,"production_trust_decision":{"schema_version":"verify.executive_verdict.v1","decision":"Allow with approval","why":"write/admin actions need confirmation safeguards + unauthenticated behavior not proven","next_action":"export policy, require approval for writes, add authenticated validation","reason_count":2},"production_readiness_class":{"code":"safe_for_evaluation","label":"Safe for evaluation","reason":"The server is suitable for evaluation, but remaining gaps should be resolved before broad production use."},"evidence_confidence":{"score":100.0,"label":"high","validation_age_hours":5.21,"live_check_count":22,"basis":{"evidence_bearing_validations":20,"affirmative_live_check_count":22,"validation_age_hours":5.21,"freshness_threshold_hours":24}},"active_alerts":[{"code":"instruction_tool_reference_mismatch","severity":"low","title":"Server instructions name unavailable tools"}],"active_alert_summary":{"critical":0,"high":0,"medium":0,"low":1,"high_or_critical":0,"total":1},"materialization":{"state":"partial","trust_core_complete":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"materialized_at":"2026-09-10T23:31:40.042807+00:00"}},"agent_commerce":{},"latest_claim":null,"maintainer_profile_slug":null,"watch_summary":{},"partial":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"trust_evaluated_at":"2026-09-10T23:31:40.042807+00:00","evidence_revision":"f19100d7c828b319217297b0","active_alert_summary":{"critical":0,"high":0,"medium":0,"low":1,"high_or_critical":0,"total":1},"materialization":{"state":"partial","trust_core_complete":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"materialized_at":"2026-09-10T23:31:40.042807+00:00"},"owner_opted_out":false,"observed_attention":{"schema":"verify.observed_attention.v1","window_days":30,"level":"none","label":"No observed attention","summary":"No recent machine-readable trust or discovery activity observed for this server.","segments":{"useful_ai_user":{"level":"none","observed":false,"description":"AI-assisted user sessions such as ChatGPT/User or Claude/User."},"machine_trust_evaluator":{"level":"none","observed":false,"description":"Synthetic sessions inspecting multiple trust surfaces such as report, policy, ledger, badge, trust-summary, or compare."},"possible_agent_or_script":{"level":"none","observed":false,"description":"Structured direct sessions with rapid profile, compare, report, policy, badge, or trust-surface fan-out."},"isolated_machine_surface":{"level":"none","observed":false,"description":"Aged-out direct synthetic singleton sessions that touched a machine-readable trust surface without becoming a broader evaluator."},"ai_crawler":{"level":"none","observed":false,"description":"Known AI crawler activity such as ClaudeBot, GPTBot, or similar crawlers."},"search_crawler":{"level":"none","observed":false,"description":"Search and SEO crawler activity."},"browser_like_automation":{"level":"none","observed":false,"description":"Browser-like synthetic sessions with rapid structured endpoint activity."},"confirmed_human":{"level":"none","observed":false,"description":"Confirmed browser-session human activity."}},"surfaces_observed":{"server_profile":false,"compare":false,"compare_json":false,"compare_api":false,"report_json":false,"policy":false,"ledger":false,"badge_metadata":false,"badge_svg":false,"trust_summary":false,"mcp_tool":false},"claim_prompt":{"recommended":false,"reason":"No claim prompt is recommended from observed attention in the current window."},"notes":["Observed attention is based on segmented first-party telemetry.","Crawler and evaluator activity is not treated as confirmed human demand.","Public levels are bucketed to avoid exposing raw traffic counts."]},"owner_activation":{"claim_recommended":false,"reason":"no_observed_attention"},"snapshot_id":"trustsnap_5dbb19f121d77c74"}],"rows":[{"label":"Snapshot ID","values":["trustsnap_5dbb19f121d77c74"]},{"label":"Status","values":["healthy"]},{"label":"Score","values":[72.92]},{"label":"Production readiness","values":["Safe for evaluation"]},{"label":"Production trust decision","values":["Allow with approval"]},{"label":"Recommended policy","values":["Block"]},{"label":"Observed Attention","values":["No observed attention"]},{"label":"Evidence confidence","values":[100.0]},{"label":"Freshness","values":["n/a"]},{"label":"Latency","values":["n/a"]},{"label":"Spec recency","values":[3.0]},{"label":"Session resume","values":[3.0]},{"label":"Step-up auth","values":[3.0]},{"label":"Transport compliance","values":[2.0]},{"label":"Utility coverage","values":[2.0]},{"label":"Publishability","values":[2.0]},{"label":"Connector replay","values":[4.0]},{"label":"Request association","values":[2.0]},{"label":"Action safety","values":[2.0]},{"label":"Registry presence","values":[2.0]},{"label":"Provenance divergence","values":[null]},{"label":"Client compatibility: ChatGPT","values":["unknown"]},{"label":"Client compatibility: Claude","values":["unknown"]},{"label":"Write-action publishing","values":["unknown"]},{"label":"Snapshot churn risk","values":["unknown"]},{"label":"Transport","values":["streamable-http"]},{"label":"Auth","values":["OAuth"]},{"label":"Tools","values":[25]},{"label":"Prompts","values":[0]},{"label":"Resources","values":[0]},{"label":"OAuth","values":[true]},{"label":"DCR","values":[true]},{"label":"Taxonomy","values":[""]},{"label":"Recommended for","values":["none"]},{"label":"Top alerts","values":["Server instructions name unavailable tools"]}],"partial":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"cache_note":"Compact compare fallback response; deep compare evidence is deferred to protect web capacity.","trust_evaluated_at":"2026-09-10T23:31:40.042807+00:00","materialization":{"state":"partial","trust_core_complete":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"materialized_at":"2026-09-10T23:31:40.076839+00:00"}}