fix(mcp): remove base64 ingest tool

Remove ingest_file_base64 from the ingest MCP tool surface so remote agents use the upload-ticket HTTP multipart path instead of oversized JSON/base64 tool arguments.

Update docs and agent rules to make base64 upload explicitly unsupported as an MCP tool while preserving ticket-based uploads outside the vault.

Validation: python3 -m unittest discover -v; python3 -m py_compile obsidian_wiki/mcp_server.py tests/test_mcp_server_remote.py; git diff --check
This commit is contained in:
Codex
2026-07-05 17:30:11 +00:00
parent d3bd7f0c08
commit c8433a2e2e
4 changed files with 3 additions and 86 deletions
+1 -53
View File
@@ -1,5 +1,4 @@
import asyncio
import base64
import hashlib
import json
import os
@@ -354,7 +353,7 @@ class RemoteMcpServerTests(unittest.TestCase):
self.assertIn("check_ingest_opencode_readiness", FakeMCP.tool_names)
self.assertIn("get_ingest_upload_instructions", FakeMCP.tool_names)
self.assertIn("create_ingest_upload_ticket", FakeMCP.tool_names)
self.assertIn("ingest_file_base64", FakeMCP.tool_names)
self.assertNotIn("ingest_file_base64", FakeMCP.tool_names)
def test_create_ingest_upload_ticket_tool_returns_http_only_token(self):
class FakeMCP:
@@ -407,57 +406,6 @@ class RemoteMcpServerTests(unittest.TestCase):
self.assertEqual(ticket["max_files"], 1)
self.assertFalse(ticket["start_job"])
def test_ingest_file_base64_tool_uploads_without_chunking(self):
class FakeMCP:
tools = {}
def __init__(self, _name, **_kwargs):
pass
def tool(self):
def decorator(func):
self.tools[func.__name__] = func
return func
return decorator
def resource(self, *_args, **_kwargs):
def decorator(func):
return func
return decorator
def prompt(self, *_args, **_kwargs):
def decorator(func):
return func
return decorator
with (
tempfile.TemporaryDirectory() as tmp,
patch.dict("sys.modules", {"mcp.server.fastmcp": type("Mod", (), {"FastMCP": FakeMCP})()}),
):
root = Path(tmp)
mcp_server.create_server(
vault_path=root / "vault",
enable_ingest=True,
project_root=root / "project",
ingest_runtime_root=root / "runtime",
)
payload = b"one shot upload"
result = FakeMCP.tools["ingest_file_base64"](
file_name="source.pdf",
data_base64=base64.b64encode(payload).decode("ascii"),
project="bjd",
doc_type_hint="drawing",
start_job=False,
)
self.assertEqual(result["job"], None)
self.assertEqual(result["upload"]["state"], "complete")
self.assertEqual(result["upload"]["file_name"], "source.pdf")
self.assertEqual(result["upload"]["sha256"], "sha256:" + hashlib.sha256(payload).hexdigest())
def test_create_server_can_disable_file_asset_tools(self):
class FakeMCP:
tool_names = []