modelcontextprotocol / modelcontextprotocol/ext-apps

`downloadFile` not implemented on Claude iOS (error -32601)

Open
#574 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
2.9k
Forks
387
Avg merge
3h 21m
Merged PRs (30d)
6

Description

app.downloadFile() returns JSON-RPC error -32601 (method not found) on Claude iOS. The capability is absent from the host's advertised capabilities.

Environment

  • Host: claude-ios/1.260323.4
  • SDK: @modelcontextprotocol/ext-apps 1.2.2
  • Desktop/web: works as expected

Host capabilities reported on iOS

{
  "openLinks": {},
  "serverTools": { "listChanged": true },
  "serverResources": { "listChanged": true },
  "logging": {},
  "updateModelContext": { "text": {}, "image": {} },
  "message": { "text": {}, "image": {} }
}

No downloadFile entry.

Reproduction

const app = new App({ name: "test", version: "1.0.0" });
await app.connect();

await app.downloadFile({
  contents: [{
    type: "resource",
    resource: {
      uri: "file:///test.txt",
      mimeType: "text/plain",
      text: "hello",
    },
  }],
});
// → MCP error -32601: ui/download-file

This is a minimal text payload — the issue is the missing host handler, not payload size or format.

Context

Discovered while building mcp-music-studio, which exports audio files via downloadFile. Both the EmbeddedResource (blob) and plain text variants fail identically. Android is untested but likely the same.

The runtime capability check (app.getHostCapabilities()?.downloadFile) is a clean detection path — apps can gate on this today and automatically pick up the feature when it ships.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with App.downloadFile and app.getHostCapabilities(), then reproduce the minimal text payload on Claude iOS 1.260323.4 and compare its advertised capabilities with desktop/web behavior. Done means the iOS host advertises downloadFile and the provided reproduction succeeds without error -32601.

Written by the indexing model from the issue text.

Assessment

Tech stack
ios, typescript
Domain
api, mobile-dev
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.