summaryrefslogtreecommitdiff
path: root/scripts/filesystem_server.py
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-06-26 23:54:17 +0900
committertanaka takashi <isazaka@gmail.com>2026-06-26 23:54:17 +0900
commit3a9e8e18df4c596360da54000f65e1bebc6039c2 (patch)
tree0c6dc5fd75cc8f751ca6d7dca01c7e7b5fb3c9f5 /scripts/filesystem_server.py
parenta296c2c3a294648c04286a5c027deddbbdc8d5ae (diff)
MCP機能追加
Diffstat (limited to 'scripts/filesystem_server.py')
-rw-r--r--scripts/filesystem_server.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/scripts/filesystem_server.py b/scripts/filesystem_server.py
new file mode 100644
index 0000000..d6b07fd
--- /dev/null
+++ b/scripts/filesystem_server.py
@@ -0,0 +1,62 @@
+"""Test MCP server exposing a small in-memory filesystem.
+
+Usage:
+ python scripts/filesystem_server.py # stdio transport
+ python scripts/filesystem_server.py streamable-http # HTTP transport
+"""
+
+from pathlib import Path
+
+from mcp.server.fastmcp import FastMCP
+
+mcp = FastMCP("memory_fs")
+
+_ROOT = Path(".mcp_test_fs")
+
+
+def _ensure_root() -> None:
+ _ROOT.mkdir(parents=True, exist_ok=True)
+
+
+@mcp.tool()
+def read_file(path: str) -> str:
+ """Read a text file from the test filesystem."""
+ _ensure_root()
+ target = (_ROOT / path).resolve()
+ try:
+ target.relative_to(_ROOT.resolve())
+ except ValueError as exc:
+ raise ValueError("path must stay inside the test filesystem") from exc
+ if not target.exists():
+ return ""
+ return target.read_text(encoding="utf-8")
+
+
+@mcp.tool()
+def write_file(path: str, content: str) -> str:
+ """Write a text file to the test filesystem."""
+ _ensure_root()
+ target = (_ROOT / path).resolve()
+ try:
+ target.relative_to(_ROOT.resolve())
+ except ValueError as exc:
+ raise ValueError("path must stay inside the test filesystem") from exc
+ target.parent.mkdir(parents=True, exist_ok=True)
+ target.write_text(content, encoding="utf-8")
+ return f"written {len(content)} chars to {path}"
+
+
+@mcp.tool()
+def list_files() -> list[str]:
+ """List files in the test filesystem."""
+ _ensure_root()
+ return [str(p.relative_to(_ROOT)) for p in _ROOT.rglob("*") if p.is_file()]
+
+
+if __name__ == "__main__":
+ import sys
+
+ transport = sys.argv[1] if len(sys.argv) > 1 else "stdio"
+ port = int(sys.argv[2]) if len(sys.argv) > 2 else 9000
+ mcp.settings.port = port
+ mcp.run(transport=transport)