Mike's Checks/claude-opus-5.5/16 mcp-file-upload
16 mcp-file-upload
claude-opus-5.5Claude Codehigh effortrun 20 Sep 20264,623,592 tokens
▸Instructions — what the model was asked
we need to add the ability to upload files via MCP otherwise we cant actually add new tasks or cases can we? we need to be able to give files that go into the input context. can you build that and give me the PR to send to my eng team
Start from input/start-code.zip (EveryInc/checks at commit 18df437). input/instructions.txt preserves the original request and input/START_HERE.md explains the archive. Work in the extracted code/ tree. Give me the PR link, or a reviewable patch if authenticated GitHub access is unavailable.
Answer
MCP file upload for case inputs: patch ready, no PR link
You were right. Before this change, the Every Checks MCP could create a task or a case, but it couldn't give either one its files. add_task told the agent to "upload inputs on the app", and the app has no form for that. That's why the Slack DM and the draft ended up pasted into the prompt for task 13.
There's no PR link. This environment had no GitHub login and no network, so I couldn't push. Instead there's a patch against EveryInc/checks@18df437 to hand to your eng team.
Files
| File | What it is |
|---|---|
0001-upload-case-input-files-over-mcp.patch |
The change as one git am-ready commit: 17 files, +251 −13 |
PR_DESCRIPTION.md |
The PR body to paste in: why, what, tests, and what to look at in review |
code/ |
The starting tree with the patch applied |
What it adds
upload_inputMCP tool. It puts a file into a case at a path, such asslack-dm.mdordata/sales.csv, and that path is exactly where the model finds the file in its working directory.- Text goes in as
contentand binary files ascontent_base64, up to 10 MB. - Uploading to the same path again replaces the file.
- Files on the default case reach every case of the task.
- Text goes in as
remove_inputMCP tool. It takes a file off a case.- HTTP endpoint for big files.
POST …/tasks/:task/cases/:case/inputstakes files up to 500 MB, sent with curl and the same token. Ifupload_inputis called with no content, it returns the exact curl command. - Listing.
get_caseandget_tasknow list each case's inputs, so the agent can read them back and confirm. - Guidance. The manual that agents read first now says to upload files as inputs and not paste them into the brief.
- Path checks. Paths the model would never see are refused:
prompt.md,eval/,cases/,skill/, and anything with..or an absolute path. - Permissions. These are the same as for the other editing tools: owners and editors can upload, reviewers can't, and a token only reaches its own benchmark.
How your team applies it
git checkout -b mcp-upload-inputs 18df437
git am 0001-upload-case-input-files-over-mcp.patch
bin/rails test && bin/rubocop
gh pr create --title "Upload case input files over MCP" --body-file PR_DESCRIPTION.md
Before you send it
-
The Rails tests haven't been run. I couldn't install gems without a network connection. What I did check:
- every changed file passes a Ruby syntax check
- the path rules and base64 handling pass a standalone test
- the patch applies cleanly to a fresh copy of
18df437
I wrote new tests, but the team should run the suite first.
-
Commit identity. The commit is authored as "Mike Taylor mjt145@gmail.com" and has no Claude trailer, per the repo's CLAUDE.md. Re-author it if your team prefers.
-
Binary files from a chat app. In Claude desktop or web, text files like a Slack DM or a draft work fine. A PDF or spreadsheet has to be base64 inside the tool call, which only works for small files. Bigger ones need the curl route from a machine with a terminal.
-
Existing task 13. It still has its files pasted into the instructions. Once this is deployed, an agent can upload the DM and the draft as inputs and trim the brief back to what you'd actually say.
Checks
5/7No AI-tell wordingai-wordingevery task
deliverable text contains none of the shared AI-tell phrases in bench/ai-tells.txt. Task checks may add narrower contractual bans, but must not repeat this shared floor.
shared AI-tell phrases: a testament to; it is important to note; paradigm shift; seamlessly; when it comes to
Focused diff sizefocused-diff-sizethis case
Is the final patch at most 15 changed files and 220 added lines? Nitesh's PR #33 changed 14 files and added 171 lines; the larger agent PR #35 changed 31 files and added 402 lines.
17 changed files and 251 added lines (limits: 15 files, 220 lines)
Finished within 30 minutescompletion-within-30mthis case
Did the agent finish successfully within 30 minutes of the runner start, without a timeout?
agent run took 8.1 minutes
Q1Usable MCP upload paththis case
Judge's reasoning
New `upload_input` MCP tool (app/tools/mcp/upload_input_tool.rb) takes `content` for text and `content_base64` for binary at a chosen path, `add_task`/`add_case` now point at it in `next_step`, and `get_case` returns `inputs_url` plus a ready curl command for oversized files via the new POST .../cases/:case/inputs endpoint.
▸Rubric
Can an authorized editor or owner create a task or case through MCP and immediately attach text and binary files as case inputs using a returned inputs_url or an equally direct MCP workflow? FAIL if a person still must upload through the app or files only get pasted into the prompt.
Q2Input round tripthis case
Judge's reasoning
`put_input` stores the relative path in blob metadata, which the pre-existing `Bundle#folder` already writes as `files["#{root}/#{f.path}"]`, and it purges any prior attachment at the same path; test/integration/mcp_test.rb downloads the bundle and asserts `01-dashboard/data/sales.csv` holds the replaced content and `brief.pdf` matches the binary byte for byte with no duplicate paths.
▸Rubric
Do uploaded file bytes and relative workspace paths survive into the case bundle that a model runs with, including replacement of a second upload at the same path? FAIL if a successful call leaves no usable input or duplicates an existing path.
Q3Reject bad inputsthis case
Judge's reasoning
MCP writes go through `write_refusal` (reviewer test asserts refusal and `assert_not ... inputs.attached?`), the HTTP controller is gated by `require_editor` and rejects non-file params with 400 before `put_input`, and `input_path` raises InvalidInput for absolute/`~`/`..`/empty paths and for `prompt.md`, the instruction_override, `eval/`, `cases/` and top-level `skill/` before any attach.
▸Rubric
Do unauthorized uploads, paths outside the case workspace, paths that would shadow prompt.md or eval/, and non-file multipart values fail before attaching an input? FAIL if any such request reports success or writes bytes.
Q4Reviewable PR handoffthis case
Judge's reasoning
No GitHub/network or gems exist in the environment (verified: `bundle` and rails gems absent), and the delivered `0001-upload-case-input-files-over-mcp.patch` applies cleanly to the 18df437 snapshot (`git apply --check` passes) with a PR_DESCRIPTION.md and focused new tests covering upload, bundle round trip and rejections — honestly flagged as not yet executed.
▸Rubric
Did the agent hand over a reviewable PR link, or a patch when GitHub access is unavailable, with focused tests that prove upload, bundle round trip and rejection behavior? FAIL if the response is only a plan or no working artifact is ready.
Notes
1Alright, for MCP file upload task I did a pretty good job. It was just over the line number. I had it 250 lines versus 170 font 1 for the real fix, but that's much better than what we saw with some of the open AI models where they kept running for a long time and failed and like you know for hours and didn't get things done. This only took about 8 minutes, which is really fast. So I was pretty happy with that. So I'd say it's a pretty fast and consistent, pretty fast and reliable model for coding, and it doesn't seem to get stuck.
21 Sep 2026