ai.dataecho/mcp
Deploy files, sites, and Dockerfile apps to live URLs + private drives for agent memory.
Block For Production
trustsnap_0f758da1b7b092ac.- Utility Coverage
- Transport Compliance
- Step Up Auth
- Add an explicit confirm/dry-run parameter or two-step confirmation flow to write, delete, exec, and egress-capable tool…
- Align MCP-Protocol-Version, MCP-Session-Id, DELETE teardown, and expired-session handling with the transport spec.
- Serve /.well-known/oauth-protected-resource and point it at your authorization server metadata.
- badge metadata inspection
Dispute this assessment
If any published claim about this server -- its score, a risk flag, a capability classification, or its taxonomy -- is factually wrong, tell us what evidence shows and we will review it. This does not require claiming or verifying ownership of the server first.
Verify responds to disputes within 5 business days and resolves them within 15.
Dispute history
No disputes filed for this server.
Risks
Security posture
Tool capability & risk inventory
| Tool | Capabilities | Risk | Findings | Notes | Evidence |
|---|---|---|---|---|---|
platform_info |
undetermined | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"undetermined"
],
"input_schema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
request_login_code |
undetermined | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"undetermined"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"email": {
"description": "The user's email address",
"type": "string"
}
},
"required": [
"email"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
verify_login_code |
write | Medium | freeform input surface | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"write"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"code": {
"description": "The one-time code from the email",
"type": "string"
},
"email": {
"description": "Same email as request_login_code",
"type": "string"
}
},
"required": [
"email",
"code"
],
"type": "object"
},
"risk_flags": [
"freeform_input_surface"
]
}
Dispute this classification
|
publish_site |
write exec secrets | High | command execution secret material access | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"write",
"exec",
"secrets"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"claimToken": {
"description": "Claim token \u2014 required to update an anonymous site without auth",
"type": "string"
},
"description": {
"description": "Viewer page description",
"type": "string"
},
"files": {
"description": "Files to publish. Each file: { path, content (utf-8 text) OR contentBase64 (binary), contentType? }. The publish is a COMPLETE snapshot \u2014 omitted files are removed on update.",
"items": {
"additionalProperties": false,
"properties": {
"content": {
"description": "UTF-8 text content (use for html/css/js/json/text)",
"type": "string"
},
"contentBase64": {
"description": "Base64 content (use for binary files)",
"type": "string"
},
"contentType": {
"description": "Optional MIME type; guessed from the extension if omitted",
"type": "string"
},
"path": {
"description": "Site-relative path, e.g. index.html or assets/app.js",
"type": "string"
}
},
"required": [
"path"
],
"type": "object"
},
"type": "array"
},
"slug": {
"description": "Existing site slug to update (omit to create a new site)",
"type": "string"
},
"spa": {
"description": "Enable SPA fallback routing (serve index.html for unknown paths)",
"type": "boolean"
},
"title": {
"description": "Viewer page title (used when there's no index.html)",
"type": "string"
},
"ttlSeconds": {
"description": "Expiry for authenticated sites, in seconds",
"type": "number"
}
},
"required": [
"files"
],
"type": "object"
},
"risk_flags": [
"command_execution",
"secret_material_access"
]
}
Dispute this classification
|
claim_site |
secrets | Medium | secret material access | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"secrets"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"claimToken": {
"description": "Claim token returned by the anonymous publish",
"type": "string"
},
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug",
"claimToken"
],
"type": "object"
},
"risk_flags": [
"secret_material_access"
]
}
Dispute this classification
|
list_sites |
read | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read"
],
"input_schema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
search_sites |
read | Low | freeform input surface | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"limit": {
"description": "Max results (optional)",
"type": "number"
},
"query": {
"description": "Search query",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"risk_flags": [
"freeform_input_surface"
]
}
Dispute this classification
|
get_site |
read | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
update_site_metadata |
write exec secrets | High | command execution secret material access freeform input surface | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"write",
"exec",
"secrets"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"description": {
"description": "Viewer description",
"type": "string"
},
"password": {
"description": "Password-gate the site; pass an empty string to REMOVE the password",
"type": "string"
},
"slug": {
"description": "Site slug",
"type": "string"
},
"spaMode": {
"description": "SPA fallback routing",
"type": "boolean"
},
"title": {
"description": "Viewer title",
"type": "string"
},
"ttlSeconds": {
"description": "Expiry in seconds (null-like 0 not allowed; omit to keep)",
"type": "number"
}
},
"required": [
"slug"
],
"type": "object"
},
"risk_flags": [
"command_execution",
"secret_material_access",
"freeform_input_surface"
]
}
Dispute this classification
|
delete_site |
undetermined | Low | none | Safeguards hinted in metadata. |
Schema & evidence{
"annotations": {},
"capabilities": [
"undetermined"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
app_status |
undetermined | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"undetermined"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"logs": {
"description": "Include build logs",
"type": "boolean"
},
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
list_drives |
read | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read"
],
"input_schema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
create_drive |
write | Medium | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"write"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"name": {
"description": "Drive name",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
drive_list_files |
read | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"prefix": {
"description": "Path prefix filter",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
drive_read_file |
read filesystem | Low | freeform input surface | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read",
"filesystem"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"path": {
"description": "File path in the drive",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"risk_flags": [
"freeform_input_surface"
]
}
Dispute this classification
|
drive_write_file |
read write filesystem | Medium | freeform input surface filesystem mutation | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read",
"write",
"filesystem"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"content": {
"description": "UTF-8 text content",
"type": "string"
},
"contentBase64": {
"description": "Base64 content for binary files",
"type": "string"
},
"contentType": {
"description": "Optional MIME type",
"type": "string"
},
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"ifMatch": {
"description": "Optional ETag precondition",
"type": "string"
},
"path": {
"description": "Destination path in the drive",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"risk_flags": [
"freeform_input_surface",
"filesystem_mutation"
]
}
Dispute this classification
|
drive_delete_file |
filesystem | Low | freeform input surface | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"filesystem"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"path": {
"description": "File path",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"risk_flags": [
"freeform_input_surface"
]
}
Dispute this classification
|
drive_move_file |
undetermined | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"undetermined"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"from": {
"description": "Current path",
"type": "string"
},
"to": {
"description": "New path",
"type": "string"
}
},
"required": [
"drive",
"from",
"to"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
drive_share |
read write filesystem | Medium | freeform input surface filesystem mutation | Safeguards hinted in metadata. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read",
"write",
"filesystem"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"label": {
"description": "Human label for the token",
"type": "string"
},
"pathPrefix": {
"description": "Restrict the token to this path prefix",
"type": "string"
},
"perms": {
"description": "read (default) or write",
"type": "string"
},
"ttl": {
"description": "Lifetime, e.g. 1h, 7d (omit for no expiry)",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"risk_flags": [
"freeform_input_surface",
"filesystem_mutation"
]
}
Dispute this classification
|
drive_tokens |
read | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
drive_revoke_token |
secrets | Medium | secret material access | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"secrets"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"tokenId": {
"description": "dtok_\u2026 id from drive_tokens",
"type": "string"
}
},
"required": [
"drive",
"tokenId"
],
"type": "object"
},
"risk_flags": [
"secret_material_access"
]
}
Dispute this classification
|
drive_history |
write | Medium | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"write"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
drive_restore |
undetermined | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"undetermined"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"versionId": {
"description": "dv_\u2026 id from drive_history",
"type": "string"
}
},
"required": [
"drive",
"versionId"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
list_variables |
read write | Medium | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read",
"write"
],
"input_schema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
set_variable |
read write | Medium | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"read",
"write"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"allowedUpstreams": {
"description": "Optional allow-list of upstream hosts",
"items": {
"type": "string"
},
"type": "array"
},
"name": {
"description": "UPPER_SNAKE_CASE variable name",
"type": "string"
},
"value": {
"description": "Secret value (never readable back)",
"type": "string"
}
},
"required": [
"name",
"value"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
delete_variable |
undetermined | Low | none | No explicit safeguard hints detected. |
Schema & evidence{
"annotations": {},
"capabilities": [
"undetermined"
],
"input_schema": {
"additionalProperties": false,
"properties": {
"name": {
"description": "Variable name",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
Write-action governance
Status detail: 2 high-risk tool(s), 2 exec-capable tool(s) are exposed without a clear auth boundary; 2 safeguard(s) and 1 confirmation signal(s) detected.
| Tool | Risk | Flags | Safeguards |
|---|---|---|---|
publish_site |
High | command execution secret material access | no |
update_site_metadata |
High | command execution secret material access freeform input surface | no |
Recommended runtime policy
No policy blockers under the default policy stance.
Action-controls diff
New actions
| Action | Risk | Flags |
|---|---|---|
| No newly added actions. | ||
Changed actions
| Action | Change types | Risk |
|---|---|---|
| No materially changed actions. | ||
Critical alerts
Compatibility
Client compatibility verdicts
Client compatibility only means the server shape can work with a client. Production trust decision and write-action publishing are evaluated separately so a client-compatible server can still be blocked for production.
Evidence provenance
initialize• OKtools_list• OKtransport_compliance_probe• Errorstep_up_auth_probe• Missingconnector_replay_probe• OK — Frozen tool snapshots must survive refresh.request_association_probe• Missing — Roots, sampling, and elicitation should stay request-scoped.
Evidence provenance
initialize• OKtools_list• OKtransport_compliance_probe• Error
Evidence provenance
action_safety_probe• Error
Evidence provenance
tool_snapshot_probe• OKconnector_replay_probe• OK
Client compatibility gate details
Remediation checklist
- Add OAuth-based authentication for remote connector auth.
- Support dynamic client registration (DCR) to simplify connector setup.
- Resolve the transport compliance failure -- see the transport compliance probe evidence for what specifically broke.
- Improve OAuth interoperability -- see the OAuth Interop score breakdown.
- Limit the exposed surface to search/fetch-style read tools.
- Remove or isolate write, delete, and exec-capable tools before using this read/search-only client profile.
Remediation checklist
- Resolve the transport compliance failure -- see the transport compliance probe evidence for what specifically broke.
- Limit the exposed surface to search/fetch-style read tools.
- Remove or isolate write, delete, and exec-capable tools before using this read/search-only client profile.
- Configure OAuth for authenticated remote MCP access.
- Remove export, bulk, mutating, and high-blast-radius exposure before certifying company-knowledge use.
- Satisfy OAuth, compatibility, and connector-refresh requirements before using the Messages API remote MCP path.
Remediation checklist
- Add a clearer auth boundary around risky write actions.
- Constrain or sandbox exec-capable tools before publishing broadly.
- Resolve the blocking production-readiness verdict before treating this as write-safe.
Verdict traces
- No active alert triggers.
Client verdict trace table
| Verdict | Status | Checks | Winning source | Conflicts |
|---|---|---|---|---|
openai_connectors |
Not client-compatible | initialize, tools_list, transport_compliance_probe, step_up_auth_probe, connector_replay_probe, request_association_probe | live_validation | none |
claude_desktop |
Not client-compatible | initialize, tools_list, transport_compliance_probe | live_validation | none |
unsafe_for_write_actions |
Publishing blocked | action_safety_probe | live_validation | none |
snapshot_churn_risk |
Low | tool_snapshot_probe, connector_replay_probe | history | none |
Publishability policy profiles
- Search Fetch Only: No
- Write Actions Present: Yes
- Oauth Configured: No
- Admin Refresh Required: No
- Safe For Company Knowledge: No
- Safe For Messages Api Remote Mcp: No
- Search Fetch Only: No
- Write Actions Present: Yes
- Oauth Configured: No
- Admin Refresh Required: No
- Safe For Company Knowledge: No
- Safe For Messages Api Remote Mcp: No
Compatibility fixtures
- remote_http_endpoint: Passes
- oauth_discovery: Degraded
- frozen_tool_snapshot_refresh: Passes
- request_association: Not Assessed
- remote_transport: Passes
- tool_discovery: Passes
- auth_connect: Passes
- safe_write_review: Degraded
Recommended for
Evidence
Current trust snapshot
trustsnap_0f758da1b7b092acCanonical machine links
Evidence confidence
Latest validation evidence
Failures
oauth_authorization_serverno authorization serveroauth_protected_resourceClient error '404 Not Found' for url 'https://dataecho.ai/.well-known/oauth-protected-resource' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404openid_configurationno authorization serverserver_cardClient error '404 Not Found' for url 'https://dataecho.ai/.well-known/mcp/server-card.json' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404transport_compliance_probeIssues: missing session id, missing protocol header, bad protocol not rejected (bad protocol=200).
Checks
| Check | Status | Latency | Evidence |
|---|---|---|---|
action_safety_probe |
Error | n/a | 2 high-risk, 2 exec-capable, non-read capabilities: write, exec tool(s); no clear auth boundary; safeguards=2; confirmation=delete site. |
advanced_capabilities_probe |
Warning | n/a | Only 2 capability signal(s): prompts, resources. |
connector_publishability_probe |
Warning | n/a | Publishability blockers: protocol version, session resume, step up auth, transport compliance, +3 more. |
connector_replay_probe |
OK | n/a | Backward compatible with no breaking tool-surface changes. |
determinism_probe |
OK | 169.7 ms | Check completed |
initialize |
OK | 495.2 ms | Protocol 2025-03-26 |
interactive_flow_probe |
OK | n/a | Check completed |
oauth_authorization_server |
Missing | n/a | no authorization server |
oauth_protected_resource |
Error | 503.1 ms | Client error '404 Not Found' for url 'https://dataecho.ai/.well-known/oauth-protected-resource' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404 |
official_registry_probe |
OK | n/a | Check completed |
openid_configuration |
Missing | n/a | no authorization server |
probe_noise_resilience |
OK | 390.4 ms | Fetched https://dataecho.ai/robots.txt |
prompt_get |
Missing | n/a | not advertised |
prompts_list |
OK | 166.7 ms | 0 prompt(s) exposed |
protocol_version_probe |
Warning | n/a | Claims 2025-03-26; 2 release(s) behind 2025-11-25. |
provenance_divergence_probe |
Not_Assessed | n/a | Check completed |
request_association_probe |
Missing | n/a | No request-association capabilities were advertised. |
resource_read |
Missing | n/a | not advertised |
resources_list |
OK | 171.5 ms | 0 resource item(s) exposed |
schema_divergence_probe |
Missing | n/a | no server card tools |
server_card |
Error | 284.8 ms | Client error '404 Not Found' for url 'https://dataecho.ai/.well-known/mcp/server-card.json' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404 |
session_resume_probe |
Warning | n/a | no session id |
step_up_auth_probe |
Missing | n/a | No OAuth or incremental-scope signals detected. |
tool_snapshot_probe |
OK | n/a | Check completed |
tools_list |
OK | 169.3 ms | 26 tool(s) exposed |
transport_compliance_probe |
Error | 167.8 ms | Issues: missing session id, missing protocol header, bad protocol not rejected (bad protocol=200). |
utility_coverage_probe |
Missing | 165.4 ms | No completions evidence; no pagination evidence; tasks missing. |
Known versions
1.0.0
Public server reputation
Benchmark tasks
| Benchmark task | Status | Evidence |
|---|---|---|
| Discover tools | Passes |
|
| Read-only fetch flow | Degraded |
|
| OAuth-required connect | Degraded |
|
| Safe write flow with confirmation | Likely to fail |
|
Utility coverage
Tool snapshot diff & changelog
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. | ||
Validation diff
Regressed checks: none
Improved checks: none
Newly assessed dimensions: none
No longer assessed dimensions: none
| Component | Previous | Latest | Delta |
|---|---|---|---|
trust_confidence_score | 3.0 | 4.0 | 1.0 |
Registry & provenance divergence
| Field | Registry | Live server card |
|---|---|---|
| Title | n/a | n/a |
| Version | n/a | n/a |
| Homepage | n/a | n/a |
Active alerts
No active alerts for the current server state.
Aliases & registry graph
| Identifier | Source | Canonical | Identity evidence | Score |
|---|---|---|---|---|
ai.dataecho/mcp |
official_registry | yes | canonical | 59.4 |
Alias consolidation
Strong alias identity requires matching remote URL, server-card URL, repository slug, or explicit registry cross-reference; shared provider namespace alone is not identity.
Source disagreements
| Field | What differs | Observed values |
|---|---|---|
| No source disagreements detected. | ||
Fix it
Why this score?
Algorithmic score breakdown
1 component(s) not assessed for this run: Provenance Divergence
Experimental candidate components
Actionable remediation
| Severity | Remediation | Why it matters | Recommended action |
|---|---|---|---|
| High | Add confirmation and dry-run semantics for risky actions | High-risk write, delete, exec, or egress tools should communicate safeguards clearly. | Add an explicit confirm/dry-run parameter or two-step confirmation flow to write, delete, exec, and egress-capable tools before they can make destructive changes.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 | Expose /.well-known/oauth-protected-resource | Without a protected-resource document, OAuth clients cannot discover auth requirements reliably. | Serve /.well-known/oauth-protected-resource and point it at your authorization server metadata.Playbook
|
| High | Publish OAuth authorization-server metadata | Clients need authorization-server metadata to discover issuer, endpoints, and DCR support. | Publish /.well-known/oauth-authorization-server from your issuer and include registration_endpoint when supported.Playbook
|
| High | Publish a complete server card | Missing or incomplete server-card metadata weakens discovery, documentation, and trust signals. | Serve /.well-known/mcp/server-card.json and include tools, prompts/resources, homepage, and support links.Playbook
|
| Medium | Adopt a current MCP protocol revision | Older protocol revisions reduce compatibility with newer clients and registry programs. | Advertise a current MCP protocol revision (2025-06-18 or later) in both the initialize response and the MCP-Protocol-Version header.Playbook
|
| Medium | Close connector-publishing gaps | Connector catalogs care about protocol recency, session behavior, auth clarity, and tool-surface stability. | Close connector-publishing gaps |
| Medium | Document minimal scopes and return cleaner auth challenges | Modern clients expect granular scopes and step-up auth signals such as WWW-Authenticate scope hints. | Return granular scopes and WWW-Authenticate challenge hints instead of forcing overly broad auth upfront.Playbook
|
| Medium | Publish OpenID configuration | OIDC metadata improves token validation and client compatibility. | Expose /.well-known/openid-configuration with issuer, jwks_uri, and supported grants.Playbook
|
| Medium | Raise Adoption & Market score | Adoption clues and public evidence that the server is intended for external use. | Increase external documentation and directory coverage so users can discover and evaluate the server. |
| Medium | Support resumable HTTP sessions cleanly | Modern MCP clients increasingly expect resumable session behavior on streamable HTTP transports. | Persist session state keyed by Mcp-Session-Id and honor Last-Event-ID on GET reconnects so clients can resume a dropped Streamable HTTP session.Playbook
|
| Low | Expose modern utility surfaces like completions, pagination, or tasks | Utility coverage improves interoperability with larger clients and long-lived agent workflows. | Expose completions, pagination, and task metadata where supported so larger clients can plan and resume work safely.Playbook
|
| Low | Publish newer MCP capability signals | Roots, sampling, elicitation, structured outputs, and related metadata improve client understanding and ranking. | Advertise only the advanced capabilities (roots, sampling, elicitation) you have actually implemented end to end in the initialize capabilities object.Playbook
|
Point loss breakdown
| Component | Current | Points missing |
|---|---|---|
| Utility Coverage | 0/4 | -4.0 |
| Transport Compliance | 0/4 | -4.0 |
| Step-Up Auth | 0/4 | -4.0 |
| Request Association | 0/4 | -4.0 |
| Recovery Semantics | 0/4 | -4.0 |
| OAuth Interop | 0/4 | -4.0 |
| Error Contract Quality | 0/4 | -4.0 |
| Secret Handling Hygiene | 1/4 | -3.0 |
| Least Privilege Scope | 1/4 | -3.0 |
| Execution / Sandbox Safety | 1/4 | -3.0 |
| Supply Chain Signal | 1/4 | -3.0 |
| Connector Publishability | 1/4 | -3.0 |
Compatibility profiles
Connector URL: https://dataecho.ai/mcp # No OAuth metadata detected. # Server: ai.dataecho/mcp
{
"mcpServers": {
"mcp": {
"command": "npx",
"args": ["mcp-remote", "https://dataecho.ai/mcp"]
}
}
}
smithery mcp add "https://dataecho.ai/mcp"
curl -sS https://dataecho.ai/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"}}}'
Governance
MCP TrustOps
TrustOps turns this report into operational controls: validation targets and SLAs, authenticated validation, semantic benchmarks, policy exports, alert subscriptions, badges, cost/compliance metadata, and runtime routing. Fresh trusted index decisions stay separate from long-tail inventory so stale scores do not masquerade as current evidence.
/v1/decideAlert subscription types
MCP Runtime hosting
Verify Hosted MCP turns a trusted server report into a managed remote MCP endpoint with GitHub deployment provenance, sandbox policy, encrypted secrets, release history, rollback, and audit/usage events.
/hosted/{namespace}/{name}/mcp| Deployment | Status | Endpoint | Release |
|---|---|---|---|
| No hosted runtime deployments yet. | |||
Authenticated validation sessions
Public validation is free. Authenticated validation is paid and proves scoped behavior, write-action safeguards, and authenticated tool execution.
/v1/verify/v1/ci/previewInstall snippets
Connector URL: https://dataecho.ai/mcp # No OAuth metadata detected. # Server: ai.dataecho/mcp
{
"mcpServers": {
"mcp": {
"command": "npx",
"args": ["mcp-remote", "https://dataecho.ai/mcp"]
}
}
}
smithery mcp add "https://dataecho.ai/mcp"
curl -sS https://dataecho.ai/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
tools/list, prompts/list, and resources/list checks.ai.dataecho/mcp.History
Validation history
| Timestamp | Status | Score | Latency | Tools |
|---|---|---|---|---|
| Aug 13, 2026 08:32:32 PM UTC | Healthy | 59.4 | 2899.4 ms | 26 |
| Aug 13, 2026 08:29:40 AM UTC | Healthy | 58.9 | 2724.7 ms | 26 |
| Aug 12, 2026 08:05:43 PM UTC | Healthy | 59.4 | 3008.6 ms | 26 |
| Aug 12, 2026 08:00:18 AM UTC | Healthy | 59.4 | 2244.8 ms | 26 |
| Aug 11, 2026 07:38:52 PM UTC | Healthy | 59.4 | 3029.5 ms | 26 |
| Aug 11, 2026 07:37:48 AM UTC | Healthy | 59.9 | 2850.2 ms | 26 |
| Aug 10, 2026 07:37:13 PM UTC | Healthy | 59.9 | 2809.9 ms | 26 |
| Aug 10, 2026 07:36:54 AM UTC | Healthy | 59.9 | 2321.9 ms | 26 |
| Aug 09, 2026 07:36:32 PM UTC | Healthy | 59.9 | 2836.3 ms | 26 |
| Aug 09, 2026 07:36:05 AM UTC | Healthy | 59.9 | 2553.3 ms | 26 |
Validation timeline
| Validated | Summary | Score | Protocol | Auth mode | Tools | High-risk tools | Changes |
|---|---|---|---|---|---|---|---|
| Aug 13, 2026 08:32:32 PM UTC | Healthy | 59.4 | 2025-03-26 | public | 26 | 2 | none |
| Aug 13, 2026 08:29:40 AM UTC | Healthy | 58.9 | 2025-03-26 | public | 26 | 2 | none |
| Aug 12, 2026 08:05:43 PM UTC | Healthy | 59.4 | 2025-03-26 | public | 26 | 2 | none |
| Aug 12, 2026 08:00:18 AM UTC | Healthy | 59.4 | 2025-03-26 | public | 26 | 2 | none |
| Aug 11, 2026 07:38:52 PM UTC | Healthy | 59.4 | 2025-03-26 | public | 26 | 2 | none |
| Aug 11, 2026 07:37:48 AM UTC | Healthy | 59.9 | 2025-03-26 | public | 26 | 2 | none |
| Aug 10, 2026 07:37:13 PM UTC | Healthy | 59.9 | 2025-03-26 | public | 26 | 2 | none |
| Aug 10, 2026 07:36:54 AM UTC | Healthy | 59.9 | 2025-03-26 | public | 26 | 2 | none |
| Aug 09, 2026 07:36:32 PM UTC | Healthy | 59.9 | 2025-03-26 | public | 26 | 2 | none |
| Aug 09, 2026 07:36:05 AM UTC | Healthy | 59.9 | 2025-03-26 | public | 26 | 2 | none |
Recent validation runs
| Started | Status | Summary | Latency | Checks |
|---|---|---|---|---|
| Aug 13, 2026 08:32:29 PM UTC | Completed | Healthy | 2899.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, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 13, 2026 08:29:37 AM UTC | Completed | Healthy | 2724.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, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 12, 2026 08:05:40 PM UTC | Completed | Healthy | 3008.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, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 12, 2026 08:00:16 AM UTC | Completed | Healthy | 2244.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, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 11, 2026 07:38:49 PM UTC | Completed | Healthy | 3029.5 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, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 11, 2026 07:37:45 AM UTC | Completed | Healthy | 2850.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, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 10, 2026 07:37:11 PM UTC | Completed | Healthy | 2809.9 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, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 10, 2026 07:36:52 AM UTC | Completed | Healthy | 2321.9 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, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 09, 2026 07:36:29 PM UTC | Completed | Healthy | 2836.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, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 09, 2026 07:36:03 AM UTC | Completed | Healthy | 2553.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, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
Incident & change feed
| Timestamp | Event | Details |
|---|---|---|
| Aug 13, 2026 08:32:32 PM UTC | Latest validation: healthy | Score 59.4 with status healthy. |
| Aug 13, 2026 08:32:32 PM UTC | Score changed | Score delta +0.5 versus the previous run. |
| Aug 13, 2026 08:29:40 AM UTC | Score changed | Score delta -0.5 versus the previous run. |
| Aug 05, 2026 10:58:16 AM UTC | Score corrected (post-1.0.503 remediation, R1 zero-anchoring) | Prior: 69.21. Corrected: 64.41. |
Technical details
Raw evidence view
Show raw JSON evidence
{
"checks": {
"action_safety_probe": {
"details": {
"auth_present": false,
"confirmation_signals": [
"delete_site"
],
"reason": null,
"safeguard_count": 2,
"summary": {
"annotation_conflict_tools": 0,
"bulk_access_tools": 0,
"capability_distribution": {
"exec": 2,
"filesystem": 4,
"read": 11,
"secrets": 4,
"undetermined": 7,
"write": 9
},
"declared_non_read_only_tools": 0,
"destructive_tools": 0,
"egress_tools": 0,
"exec_tools": 2,
"has_mutating_capability": true,
"has_non_read_capability": true,
"high_risk_tools": 2,
"risk_distribution": {
"critical": 0,
"high": 2,
"low": 15,
"medium": 9
},
"secret_tools": 4,
"tool_count": 26
}
},
"latency_ms": null,
"status": "error"
},
"advanced_capabilities_probe": {
"details": {
"capabilities": {
"completions": false,
"elicitation": false,
"prompts": true,
"resource_links": false,
"resources": true,
"roots": false,
"sampling": false,
"structured_outputs": false
},
"enabled": [
"prompts",
"resources"
],
"enabled_count": 2,
"initialize_capability_keys": [
"tools"
]
},
"latency_ms": null,
"status": "warning"
},
"connector_publishability_probe": {
"details": {
"blockers": [
"protocol_version",
"session_resume",
"step_up_auth",
"transport_compliance",
"request_association",
"action_safety",
"server_card"
],
"criteria": {
"action_safety": false,
"auth_flow": true,
"connector_replay": true,
"initialize": true,
"protocol_version": false,
"remote_transport": true,
"request_association": false,
"server_card": false,
"session_resume": false,
"step_up_auth": false,
"tool_surface": true,
"tools_list": true,
"transport_compliance": false
},
"high_risk_tools": 2,
"tool_count": 26,
"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": "0cdc3aed2776a0580d705a393f22cb0fe87a33ac832799f4af53a005cb5637c5",
"errors": [],
"matches": 2,
"stable_ratio": 1.0,
"successful": 2
},
"latency_ms": 169.73,
"status": "ok"
},
"initialize": {
"details": {
"headers": {
"content-type": "application/json"
},
"http_status": 200,
"payload": {
"id": 1,
"jsonrpc": "2.0",
"result": {
"capabilities": {
"tools": {
"listChanged": false
}
},
"instructions": "DataEcho hosts what agents build: publish_site deploys files/sites/apps to a live URL (anonymous works \u2014 24h expiry, ALWAYS show the user the claimUrl), drives are private versioned cloud storage. Authenticate by sending the platform API key as `Authorization: Bearer <key>` (get one via request_login_code \u2192 verify_login_code). Container apps: include a Dockerfile, must listen on process.env.PORT, persist under /data, poll app_status. Large folders: prefer the dataecho skill (npx skills add mohocp/dataecho).",
"protocolVersion": "2025-03-26",
"serverInfo": {
"name": "dataecho",
"title": "DataEcho",
"version": "1.0.0"
}
}
},
"url": "https://dataecho.ai/mcp"
},
"latency_ms": 495.21,
"status": "ok"
},
"interactive_flow_probe": {
"details": {
"oauth_supported": false,
"prompt_available": false,
"risk_hits": [],
"safe_hits": [
"login"
]
},
"latency_ms": null,
"status": "ok"
},
"oauth_authorization_server": {
"details": {
"reason": "no_authorization_server"
},
"latency_ms": null,
"status": "missing"
},
"oauth_protected_resource": {
"details": {
"error": "Client error '404 Not Found' for url 'https://dataecho.ai/.well-known/oauth-protected-resource'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://dataecho.ai/.well-known/oauth-protected-resource"
},
"latency_ms": 503.11,
"status": "error"
},
"official_registry_probe": {
"details": {
"direct_match": true,
"official_peer_count": 1,
"registry_identifier": "ai.dataecho/mcp",
"registry_source": "official_registry"
},
"latency_ms": null,
"status": "ok"
},
"openid_configuration": {
"details": {
"reason": "no_authorization_server"
},
"latency_ms": null,
"status": "missing"
},
"probe_noise_resilience": {
"details": {
"consent_error": null,
"headers": {
"content-type": "text/plain; charset=utf-8"
},
"http_status": 200,
"url": "https://dataecho.ai/robots.txt",
"validation_disallowed": false
},
"latency_ms": 390.39,
"status": "ok"
},
"prompt_get": {
"details": {
"reason": "not_advertised"
},
"latency_ms": null,
"status": "missing"
},
"prompts_list": {
"details": {
"headers": {
"content-type": "application/json"
},
"http_status": 200,
"payload": {
"id": 3,
"jsonrpc": "2.0",
"result": {
"prompts": []
}
},
"url": "https://dataecho.ai/mcp"
},
"latency_ms": 166.68,
"status": "ok"
},
"protocol_version_probe": {
"details": {
"claimed_version": "2025-03-26",
"lag_days": 244,
"latest_known_version": "2025-11-25",
"releases_behind": 2,
"validator_protocol_version": "2025-03-26"
},
"latency_ms": null,
"status": "warning"
},
"provenance_divergence_probe": {
"details": {
"comparable_field_count": 0,
"compared_fields": [
"title",
"version",
"homepage",
"repository"
],
"direct_official_match": true,
"drift_fields": [],
"metadata_document_count": 2,
"readable_sources": [
"registry"
],
"registry_homepage": null,
"registry_repository": null,
"registry_title": null,
"registry_version": null,
"server_card_homepage": null,
"server_card_repository": null,
"server_card_title": null,
"server_card_version": null
},
"latency_ms": null,
"status": "not_assessed"
},
"request_association_probe": {
"details": {
"reason": "no_request_association_capabilities_advertised"
},
"latency_ms": null,
"status": "missing"
},
"resource_read": {
"details": {
"reason": "not_advertised"
},
"latency_ms": null,
"status": "missing"
},
"resources_list": {
"details": {
"headers": {
"content-type": "application/json"
},
"http_status": 200,
"payload": {
"id": 5,
"jsonrpc": "2.0",
"result": {
"resources": []
}
},
"url": "https://dataecho.ai/mcp"
},
"latency_ms": 171.46,
"status": "ok"
},
"schema_divergence_probe": {
"details": {
"auth_scheme_mismatch": false,
"card_server_name": null,
"card_server_version": null,
"compared_dimensions": [
"server_name",
"server_version",
"declared_vs_observed_auth",
"tool_membership",
"parameter_names",
"required_parameters",
"parameter_types",
"output_schema_presence"
],
"compared_tool_count": 0,
"live_server_name": "dataecho",
"live_server_version": "1.0.0",
"reason": "no_server_card_tools",
"server_name_mismatch": false,
"server_version_mismatch": false
},
"latency_ms": null,
"status": "missing"
},
"server_card": {
"details": {
"error": "Client error '404 Not Found' for url 'https://dataecho.ai/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://dataecho.ai/.well-known/mcp/server-card.json"
},
"latency_ms": 284.84,
"status": "error"
},
"session_resume_probe": {
"details": {
"protocol_version": "2025-03-26",
"reason": "no_session_id",
"resume_expected": true,
"transport": "streamable-http"
},
"latency_ms": null,
"status": "warning"
},
"step_up_auth_probe": {
"details": {
"auth_required_checks": [],
"broad_scopes": [],
"challenge_headers": [],
"minimal_scope_documented": false,
"oauth_present": false,
"scope_specificity_ratio": 0.0,
"step_up_signals": [],
"supported_scopes": []
},
"latency_ms": null,
"status": "missing"
},
"tool_snapshot_probe": {
"details": {
"added": [],
"changed_outputs": [],
"current_tool_count": 26,
"previous_tool_count": 26,
"removed": [],
"similarity": 1.0
},
"latency_ms": null,
"status": "ok"
},
"tools_list": {
"details": {
"headers": {
"content-type": "application/json"
},
"http_status": 200,
"payload": {
"id": 2,
"jsonrpc": "2.0",
"result": {
"tools": [
{
"description": "DataEcho platform overview: what it can host, auth state of this connection, docs links. Call this first if unsure.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "platform_info"
},
{
"description": "Start sign-in: email a one-time code to the user. Follow with verify_login_code.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"email": {
"description": "The user's email address",
"type": "string"
}
},
"required": [
"email"
],
"type": "object"
},
"name": "request_login_code"
},
{
"description": "Complete sign-in with the emailed code. Returns the apiKey ONCE \u2014 configure it as the `Authorization: Bearer <key>` header of this MCP connection (and/or save to ~/.artifact/credentials for the CLI scripts). Never echo it into chat.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"code": {
"description": "The one-time code from the email",
"type": "string"
},
"email": {
"description": "Same email as request_login_code",
"type": "string"
}
},
"required": [
"email",
"code"
],
"type": "object"
},
"name": "verify_login_code"
},
{
"description": "Deploy files to a live URL. No slug \u2192 create a NEW site (works without auth; anonymous sites expire in 24h \u2014 always show the user the claimUrl). With slug \u2192 UPDATE that site (complete snapshot: send ALL files). A Dockerfile in the files makes it a server-side app (auth required; listen on process.env.PORT; persist under /data; poll app_status). Total payload \u2264 8 MB \u2014 for bigger sites use the dataecho skill scripts.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"claimToken": {
"description": "Claim token \u2014 required to update an anonymous site without auth",
"type": "string"
},
"description": {
"description": "Viewer page description",
"type": "string"
},
"files": {
"description": "Files to publish. Each file: { path, content (utf-8 text) OR contentBase64 (binary), contentType? }. The publish is a COMPLETE snapshot \u2014 omitted files are removed on update.",
"items": {
"additionalProperties": false,
"properties": {
"content": {
"description": "UTF-8 text content (use for html/css/js/json/text)",
"type": "string"
},
"contentBase64": {
"description": "Base64 content (use for binary files)",
"type": "string"
},
"contentType": {
"description": "Optional MIME type; guessed from the extension if omitted",
"type": "string"
},
"path": {
"description": "Site-relative path, e.g. index.html or assets/app.js",
"type": "string"
}
},
"required": [
"path"
],
"type": "object"
},
"type": "array"
},
"slug": {
"description": "Existing site slug to update (omit to create a new site)",
"type": "string"
},
"spa": {
"description": "Enable SPA fallback routing (serve index.html for unknown paths)",
"type": "boolean"
},
"title": {
"description": "Viewer page title (used when there's no index.html)",
"type": "string"
},
"ttlSeconds": {
"description": "Expiry for authenticated sites, in seconds",
"type": "number"
}
},
"required": [
"files"
],
"type": "object"
},
"name": "publish_site"
},
{
"description": "Make a previously-anonymous site permanent under the authenticated account (requires auth + the claimToken from publish_site).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"claimToken": {
"description": "Claim token returned by the anonymous publish",
"type": "string"
},
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug",
"claimToken"
],
"type": "object"
},
"name": "claim_site"
},
{
"description": "List all sites owned by the authenticated account.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_sites"
},
{
"description": "Full-text search across the authenticated account's sites (names, metadata, and text content).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"description": "Max results (optional)",
"type": "number"
},
"query": {
"description": "Search query",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search_sites"
},
{
"description": "Full details + current file manifest of an owned site.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "get_site"
},
{
"description": "Patch site settings without redeploying: viewer title/description, SPA mode, TTL, password (string sets, null removes).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"description": {
"description": "Viewer description",
"type": "string"
},
"password": {
"description": "Password-gate the site; pass an empty string to REMOVE the password",
"type": "string"
},
"slug": {
"description": "Site slug",
"type": "string"
},
"spaMode": {
"description": "SPA fallback routing",
"type": "boolean"
},
"title": {
"description": "Viewer title",
"type": "string"
},
"ttlSeconds": {
"description": "Expiry in seconds (null-like 0 not allowed; omit to keep)",
"type": "number"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "update_site_metadata"
},
{
"description": "Permanently delete an owned site. Irreversible \u2014 confirm with the user first.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "delete_site"
},
{
"description": "Build/run status of a container app deployed via publish_site with a Dockerfile. Poll until status is `live` or `failed`.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"logs": {
"description": "Include build logs",
"type": "boolean"
},
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "app_status"
},
{
"description": "List the authenticated account's private cloud drives.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_drives"
},
{
"description": "Create a new private drive.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"name": {
"description": "Drive name",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_drive"
},
{
"description": "List files in a drive (by drive name or drv_\u2026 id), optionally under a path prefix.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"prefix": {
"description": "Path prefix filter",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_list_files"
},
{
"description": "Read a file from a drive. Text comes back as utf-8 `content`; binary as `contentBase64`. Files over 1 MB are refused (use the skill scripts).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"path": {
"description": "File path in the drive",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"name": "drive_read_file"
},
{
"description": "Write/overwrite one file in a drive (ETag-safe: pass ifMatch to assert the version you read, otherwise the current version is used automatically).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"content": {
"description": "UTF-8 text content",
"type": "string"
},
"contentBase64": {
"description": "Base64 content for binary files",
"type": "string"
},
"contentType": {
"description": "Optional MIME type",
"type": "string"
},
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"ifMatch": {
"description": "Optional ETag precondition",
"type": "string"
},
"path": {
"description": "Destination path in the drive",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"name": "drive_write_file"
},
{
"description": "Delete one file from a drive.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"path": {
"description": "File path",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"name": "drive_delete_file"
},
{
"description": "Move/rename a file inside a drive.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"from": {
"description": "Current path",
"type": "string"
},
"to": {
"description": "New path",
"type": "string"
}
},
"required": [
"drive",
"from",
"to"
],
"type": "object"
},
"name": "drive_move_file"
},
{
"description": "Mint a scoped drive access token for another agent (perms read|write, optional path prefix + TTL like `7d`). The secret is returned ONCE.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"label": {
"description": "Human label for the token",
"type": "string"
},
"pathPrefix": {
"description": "Restrict the token to this path prefix",
"type": "string"
},
"perms": {
"description": "read (default) or write",
"type": "string"
},
"ttl": {
"description": "Lifetime, e.g. 1h, 7d (omit for no expiry)",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_share"
},
{
"description": "List active share tokens of a drive (secrets are never shown again).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_tokens"
},
{
"description": "Revoke a drive share token.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"tokenId": {
"description": "dtok_\u2026 id from drive_tokens",
"type": "string"
}
},
"required": [
"drive",
"tokenId"
],
"type": "object"
},
"name": "drive_revoke_token"
},
{
"description": "Version timeline of a drive (every write is a restorable version).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_history"
},
{
"description": "Restore a drive to a prior version (commits a new version; nothing is lost).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"versionId": {
"description": "dv_\u2026 id from drive_history",
"type": "string"
}
},
"required": [
"drive",
"versionId"
],
"type": "object"
},
"name": "drive_restore"
},
{
"description": "List account variable NAMES (values are write-only \u2014 they are injected into proxy calls and container apps, never read back).",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_variables"
},
{
"description": "Create/update a write-only account secret (uppercase name). Injected as env vars into container apps and as ${VAR} into proxy calls. Optionally pin which upstream hosts may receive it.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"allowedUpstreams": {
"description": "Optional allow-list of upstream hosts",
"items": {
"type": "string"
},
"type": "array"
},
"name": {
"description": "UPPER_SNAKE_CASE variable name",
"type": "string"
},
"value": {
"description": "Secret value (never readable back)",
"type": "string"
}
},
"required": [
"name",
"value"
],
"type": "object"
},
"name": "set_variable"
},
{
"description": "Delete an account variable.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"name": {
"description": "Variable name",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "delete_variable"
}
]
}
},
"url": "https://dataecho.ai/mcp"
},
"latency_ms": 169.31,
"status": "ok"
},
"transport_compliance_probe": {
"details": {
"bad_protocol_error": null,
"bad_protocol_headers": {
"content-type": "application/json"
},
"bad_protocol_payload": {
"id": 410,
"jsonrpc": "2.0",
"result": {
"tools": [
{
"description": "DataEcho platform overview: what it can host, auth state of this connection, docs links. Call this first if unsure.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "platform_info"
},
{
"description": "Start sign-in: email a one-time code to the user. Follow with verify_login_code.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"email": {
"description": "The user's email address",
"type": "string"
}
},
"required": [
"email"
],
"type": "object"
},
"name": "request_login_code"
},
{
"description": "Complete sign-in with the emailed code. Returns the apiKey ONCE \u2014 configure it as the `Authorization: Bearer <key>` header of this MCP connection (and/or save to ~/.artifact/credentials for the CLI scripts). Never echo it into chat.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"code": {
"description": "The one-time code from the email",
"type": "string"
},
"email": {
"description": "Same email as request_login_code",
"type": "string"
}
},
"required": [
"email",
"code"
],
"type": "object"
},
"name": "verify_login_code"
},
{
"description": "Deploy files to a live URL. No slug \u2192 create a NEW site (works without auth; anonymous sites expire in 24h \u2014 always show the user the claimUrl). With slug \u2192 UPDATE that site (complete snapshot: send ALL files). A Dockerfile in the files makes it a server-side app (auth required; listen on process.env.PORT; persist under /data; poll app_status). Total payload \u2264 8 MB \u2014 for bigger sites use the dataecho skill scripts.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"claimToken": {
"description": "Claim token \u2014 required to update an anonymous site without auth",
"type": "string"
},
"description": {
"description": "Viewer page description",
"type": "string"
},
"files": {
"description": "Files to publish. Each file: { path, content (utf-8 text) OR contentBase64 (binary), contentType? }. The publish is a COMPLETE snapshot \u2014 omitted files are removed on update.",
"items": {
"additionalProperties": false,
"properties": {
"content": {
"description": "UTF-8 text content (use for html/css/js/json/text)",
"type": "string"
},
"contentBase64": {
"description": "Base64 content (use for binary files)",
"type": "string"
},
"contentType": {
"description": "Optional MIME type; guessed from the extension if omitted",
"type": "string"
},
"path": {
"description": "Site-relative path, e.g. index.html or assets/app.js",
"type": "string"
}
},
"required": [
"path"
],
"type": "object"
},
"type": "array"
},
"slug": {
"description": "Existing site slug to update (omit to create a new site)",
"type": "string"
},
"spa": {
"description": "Enable SPA fallback routing (serve index.html for unknown paths)",
"type": "boolean"
},
"title": {
"description": "Viewer page title (used when there's no index.html)",
"type": "string"
},
"ttlSeconds": {
"description": "Expiry for authenticated sites, in seconds",
"type": "number"
}
},
"required": [
"files"
],
"type": "object"
},
"name": "publish_site"
},
{
"description": "Make a previously-anonymous site permanent under the authenticated account (requires auth + the claimToken from publish_site).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"claimToken": {
"description": "Claim token returned by the anonymous publish",
"type": "string"
},
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug",
"claimToken"
],
"type": "object"
},
"name": "claim_site"
},
{
"description": "List all sites owned by the authenticated account.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_sites"
},
{
"description": "Full-text search across the authenticated account's sites (names, metadata, and text content).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"description": "Max results (optional)",
"type": "number"
},
"query": {
"description": "Search query",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search_sites"
},
{
"description": "Full details + current file manifest of an owned site.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "get_site"
},
{
"description": "Patch site settings without redeploying: viewer title/description, SPA mode, TTL, password (string sets, null removes).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"description": {
"description": "Viewer description",
"type": "string"
},
"password": {
"description": "Password-gate the site; pass an empty string to REMOVE the password",
"type": "string"
},
"slug": {
"description": "Site slug",
"type": "string"
},
"spaMode": {
"description": "SPA fallback routing",
"type": "boolean"
},
"title": {
"description": "Viewer title",
"type": "string"
},
"ttlSeconds": {
"description": "Expiry in seconds (null-like 0 not allowed; omit to keep)",
"type": "number"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "update_site_metadata"
},
{
"description": "Permanently delete an owned site. Irreversible \u2014 confirm with the user first.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "delete_site"
},
{
"description": "Build/run status of a container app deployed via publish_site with a Dockerfile. Poll until status is `live` or `failed`.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"logs": {
"description": "Include build logs",
"type": "boolean"
},
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "app_status"
},
{
"description": "List the authenticated account's private cloud drives.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_drives"
},
{
"description": "Create a new private drive.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"name": {
"description": "Drive name",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_drive"
},
{
"description": "List files in a drive (by drive name or drv_\u2026 id), optionally under a path prefix.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"prefix": {
"description": "Path prefix filter",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_list_files"
},
{
"description": "Read a file from a drive. Text comes back as utf-8 `content`; binary as `contentBase64`. Files over 1 MB are refused (use the skill scripts).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"path": {
"description": "File path in the drive",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"name": "drive_read_file"
},
{
"description": "Write/overwrite one file in a drive (ETag-safe: pass ifMatch to assert the version you read, otherwise the current version is used automatically).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"content": {
"description": "UTF-8 text content",
"type": "string"
},
"contentBase64": {
"description": "Base64 content for binary files",
"type": "string"
},
"contentType": {
"description": "Optional MIME type",
"type": "string"
},
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"ifMatch": {
"description": "Optional ETag precondition",
"type": "string"
},
"path": {
"description": "Destination path in the drive",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"name": "drive_write_file"
},
{
"description": "Delete one file from a drive.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"path": {
"description": "File path",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"name": "drive_delete_file"
},
{
"description": "Move/rename a file inside a drive.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"from": {
"description": "Current path",
"type": "string"
},
"to": {
"description": "New path",
"type": "string"
}
},
"required": [
"drive",
"from",
"to"
],
"type": "object"
},
"name": "drive_move_file"
},
{
"description": "Mint a scoped drive access token for another agent (perms read|write, optional path prefix + TTL like `7d`). The secret is returned ONCE.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"label": {
"description": "Human label for the token",
"type": "string"
},
"pathPrefix": {
"description": "Restrict the token to this path prefix",
"type": "string"
},
"perms": {
"description": "read (default) or write",
"type": "string"
},
"ttl": {
"description": "Lifetime, e.g. 1h, 7d (omit for no expiry)",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_share"
},
{
"description": "List active share tokens of a drive (secrets are never shown again).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_tokens"
},
{
"description": "Revoke a drive share token.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"tokenId": {
"description": "dtok_\u2026 id from drive_tokens",
"type": "string"
}
},
"required": [
"drive",
"tokenId"
],
"type": "object"
},
"name": "drive_revoke_token"
},
{
"description": "Version timeline of a drive (every write is a restorable version).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_history"
},
{
"description": "Restore a drive to a prior version (commits a new version; nothing is lost).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"versionId": {
"description": "dv_\u2026 id from drive_history",
"type": "string"
}
},
"required": [
"drive",
"versionId"
],
"type": "object"
},
"name": "drive_restore"
},
{
"description": "List account variable NAMES (values are write-only \u2014 they are injected into proxy calls and container apps, never read back).",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_variables"
},
{
"description": "Create/update a write-only account secret (uppercase name). Injected as env vars into container apps and as ${VAR} into proxy calls. Optionally pin which upstream hosts may receive it.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"allowedUpstreams": {
"description": "Optional allow-list of upstream hosts",
"items": {
"type": "string"
},
"type": "array"
},
"name": {
"description": "UPPER_SNAKE_CASE variable name",
"type": "string"
},
"value": {
"description": "Secret value (never readable back)",
"type": "string"
}
},
"required": [
"name",
"value"
],
"type": "object"
},
"name": "set_variable"
},
{
"description": "Delete an account variable.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"name": {
"description": "Variable name",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "delete_variable"
}
]
}
},
"bad_protocol_status_code": 200,
"delete_error": null,
"delete_status_code": null,
"expired_session_error": null,
"expired_session_status_code": null,
"issues": [
"missing_session_id",
"missing_protocol_header",
"bad_protocol_not_rejected"
],
"last_event_id_visible": false,
"protocol_header_present": false,
"requested_protocol_version": "2025-03-26",
"session_id_present": false,
"transport": "streamable-http"
},
"latency_ms": 167.81,
"status": "error"
},
"utility_coverage_probe": {
"details": {
"completions": {
"advertised": false,
"live_probe": "not_executed",
"sample_target": null
},
"initialize_capability_keys": [
"tools"
],
"pagination": {
"metadata_signal": false,
"next_cursor_methods": [],
"supported": false
},
"tasks": {
"advertised": false,
"http_status": 200,
"probe_status": "missing"
}
},
"latency_ms": 165.39,
"status": "missing"
}
},
"failures": {
"oauth_authorization_server": {
"reason": "no_authorization_server"
},
"oauth_protected_resource": {
"error": "Client error '404 Not Found' for url 'https://dataecho.ai/.well-known/oauth-protected-resource'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://dataecho.ai/.well-known/oauth-protected-resource"
},
"openid_configuration": {
"reason": "no_authorization_server"
},
"server_card": {
"error": "Client error '404 Not Found' for url 'https://dataecho.ai/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://dataecho.ai/.well-known/mcp/server-card.json"
},
"transport_compliance_probe": {
"bad_protocol_error": null,
"bad_protocol_headers": {
"content-type": "application/json"
},
"bad_protocol_payload": {
"id": 410,
"jsonrpc": "2.0",
"result": {
"tools": [
{
"description": "DataEcho platform overview: what it can host, auth state of this connection, docs links. Call this first if unsure.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "platform_info"
},
{
"description": "Start sign-in: email a one-time code to the user. Follow with verify_login_code.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"email": {
"description": "The user's email address",
"type": "string"
}
},
"required": [
"email"
],
"type": "object"
},
"name": "request_login_code"
},
{
"description": "Complete sign-in with the emailed code. Returns the apiKey ONCE \u2014 configure it as the `Authorization: Bearer <key>` header of this MCP connection (and/or save to ~/.artifact/credentials for the CLI scripts). Never echo it into chat.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"code": {
"description": "The one-time code from the email",
"type": "string"
},
"email": {
"description": "Same email as request_login_code",
"type": "string"
}
},
"required": [
"email",
"code"
],
"type": "object"
},
"name": "verify_login_code"
},
{
"description": "Deploy files to a live URL. No slug \u2192 create a NEW site (works without auth; anonymous sites expire in 24h \u2014 always show the user the claimUrl). With slug \u2192 UPDATE that site (complete snapshot: send ALL files). A Dockerfile in the files makes it a server-side app (auth required; listen on process.env.PORT; persist under /data; poll app_status). Total payload \u2264 8 MB \u2014 for bigger sites use the dataecho skill scripts.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"claimToken": {
"description": "Claim token \u2014 required to update an anonymous site without auth",
"type": "string"
},
"description": {
"description": "Viewer page description",
"type": "string"
},
"files": {
"description": "Files to publish. Each file: { path, content (utf-8 text) OR contentBase64 (binary), contentType? }. The publish is a COMPLETE snapshot \u2014 omitted files are removed on update.",
"items": {
"additionalProperties": false,
"properties": {
"content": {
"description": "UTF-8 text content (use for html/css/js/json/text)",
"type": "string"
},
"contentBase64": {
"description": "Base64 content (use for binary files)",
"type": "string"
},
"contentType": {
"description": "Optional MIME type; guessed from the extension if omitted",
"type": "string"
},
"path": {
"description": "Site-relative path, e.g. index.html or assets/app.js",
"type": "string"
}
},
"required": [
"path"
],
"type": "object"
},
"type": "array"
},
"slug": {
"description": "Existing site slug to update (omit to create a new site)",
"type": "string"
},
"spa": {
"description": "Enable SPA fallback routing (serve index.html for unknown paths)",
"type": "boolean"
},
"title": {
"description": "Viewer page title (used when there's no index.html)",
"type": "string"
},
"ttlSeconds": {
"description": "Expiry for authenticated sites, in seconds",
"type": "number"
}
},
"required": [
"files"
],
"type": "object"
},
"name": "publish_site"
},
{
"description": "Make a previously-anonymous site permanent under the authenticated account (requires auth + the claimToken from publish_site).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"claimToken": {
"description": "Claim token returned by the anonymous publish",
"type": "string"
},
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug",
"claimToken"
],
"type": "object"
},
"name": "claim_site"
},
{
"description": "List all sites owned by the authenticated account.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_sites"
},
{
"description": "Full-text search across the authenticated account's sites (names, metadata, and text content).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"description": "Max results (optional)",
"type": "number"
},
"query": {
"description": "Search query",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search_sites"
},
{
"description": "Full details + current file manifest of an owned site.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "get_site"
},
{
"description": "Patch site settings without redeploying: viewer title/description, SPA mode, TTL, password (string sets, null removes).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"description": {
"description": "Viewer description",
"type": "string"
},
"password": {
"description": "Password-gate the site; pass an empty string to REMOVE the password",
"type": "string"
},
"slug": {
"description": "Site slug",
"type": "string"
},
"spaMode": {
"description": "SPA fallback routing",
"type": "boolean"
},
"title": {
"description": "Viewer title",
"type": "string"
},
"ttlSeconds": {
"description": "Expiry in seconds (null-like 0 not allowed; omit to keep)",
"type": "number"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "update_site_metadata"
},
{
"description": "Permanently delete an owned site. Irreversible \u2014 confirm with the user first.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "delete_site"
},
{
"description": "Build/run status of a container app deployed via publish_site with a Dockerfile. Poll until status is `live` or `failed`.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"logs": {
"description": "Include build logs",
"type": "boolean"
},
"slug": {
"description": "Site slug",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "app_status"
},
{
"description": "List the authenticated account's private cloud drives.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_drives"
},
{
"description": "Create a new private drive.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"name": {
"description": "Drive name",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_drive"
},
{
"description": "List files in a drive (by drive name or drv_\u2026 id), optionally under a path prefix.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"prefix": {
"description": "Path prefix filter",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_list_files"
},
{
"description": "Read a file from a drive. Text comes back as utf-8 `content`; binary as `contentBase64`. Files over 1 MB are refused (use the skill scripts).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"path": {
"description": "File path in the drive",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"name": "drive_read_file"
},
{
"description": "Write/overwrite one file in a drive (ETag-safe: pass ifMatch to assert the version you read, otherwise the current version is used automatically).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"content": {
"description": "UTF-8 text content",
"type": "string"
},
"contentBase64": {
"description": "Base64 content for binary files",
"type": "string"
},
"contentType": {
"description": "Optional MIME type",
"type": "string"
},
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"ifMatch": {
"description": "Optional ETag precondition",
"type": "string"
},
"path": {
"description": "Destination path in the drive",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"name": "drive_write_file"
},
{
"description": "Delete one file from a drive.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"path": {
"description": "File path",
"type": "string"
}
},
"required": [
"drive",
"path"
],
"type": "object"
},
"name": "drive_delete_file"
},
{
"description": "Move/rename a file inside a drive.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"from": {
"description": "Current path",
"type": "string"
},
"to": {
"description": "New path",
"type": "string"
}
},
"required": [
"drive",
"from",
"to"
],
"type": "object"
},
"name": "drive_move_file"
},
{
"description": "Mint a scoped drive access token for another agent (perms read|write, optional path prefix + TTL like `7d`). The secret is returned ONCE.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"label": {
"description": "Human label for the token",
"type": "string"
},
"pathPrefix": {
"description": "Restrict the token to this path prefix",
"type": "string"
},
"perms": {
"description": "read (default) or write",
"type": "string"
},
"ttl": {
"description": "Lifetime, e.g. 1h, 7d (omit for no expiry)",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_share"
},
{
"description": "List active share tokens of a drive (secrets are never shown again).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_tokens"
},
{
"description": "Revoke a drive share token.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"tokenId": {
"description": "dtok_\u2026 id from drive_tokens",
"type": "string"
}
},
"required": [
"drive",
"tokenId"
],
"type": "object"
},
"name": "drive_revoke_token"
},
{
"description": "Version timeline of a drive (every write is a restorable version).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
}
},
"required": [
"drive"
],
"type": "object"
},
"name": "drive_history"
},
{
"description": "Restore a drive to a prior version (commits a new version; nothing is lost).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"drive": {
"description": "Drive name or drv_\u2026 id",
"type": "string"
},
"versionId": {
"description": "dv_\u2026 id from drive_history",
"type": "string"
}
},
"required": [
"drive",
"versionId"
],
"type": "object"
},
"name": "drive_restore"
},
{
"description": "List account variable NAMES (values are write-only \u2014 they are injected into proxy calls and container apps, never read back).",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_variables"
},
{
"description": "Create/update a write-only account secret (uppercase name). Injected as env vars into container apps and as ${VAR} into proxy calls. Optionally pin which upstream hosts may receive it.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"allowedUpstreams": {
"description": "Optional allow-list of upstream hosts",
"items": {
"type": "string"
},
"type": "array"
},
"name": {
"description": "UPPER_SNAKE_CASE variable name",
"type": "string"
},
"value": {
"description": "Secret value (never readable back)",
"type": "string"
}
},
"required": [
"name",
"value"
],
"type": "object"
},
"name": "set_variable"
},
{
"description": "Delete an account variable.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"name": {
"description": "Variable name",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "delete_variable"
}
]
}
},
"bad_protocol_status_code": 200,
"delete_error": null,
"delete_status_code": null,
"expired_session_error": null,
"expired_session_status_code": null,
"issues": [
"missing_session_id",
"missing_protocol_header",
"bad_protocol_not_rejected"
],
"last_event_id_visible": false,
"protocol_header_present": false,
"requested_protocol_version": "2025-03-26",
"session_id_present": false,
"transport": "streamable-http"
}
},
"remote_url": "https://dataecho.ai/mcp",
"server_card_payload": null,
"server_identifier": "ai.dataecho/mcp"
}
Capabilities
- OAuth:
- DCR/CIMD:
- Prompts:
- Homepage: https://dataecho.ai
- Docs: none
- Support: none
- Icon: none
- Remote endpoint: https://dataecho.ai/mcp
- Server card: none
Transport compliance drilldown
Issues: missing_session_id, missing_protocol_header, bad_protocol_not_rejected
Request association
Connector replay
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. | ||