@subseam/mcp 0.4.14 → 0.4.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,7 +13,7 @@ and the rest. It runs on your machine and talks to the subseam service over HTTP
13
13
 
14
14
  - Node.js 22 or later, and npm.
15
15
  - A GitHub account, and a subseam organization that someone has added you to.
16
- - The subseam API URL: `https://subseam.theconstructory.com/subseam`.
16
+ - The subseam URL: `https://subseam.theconstructory.com`.
17
17
 
18
18
  ## 1. Sign in
19
19
 
@@ -23,27 +23,17 @@ owner your GitHub login so they can add you.
23
23
 
24
24
  ## 2. Get a token
25
25
 
26
- The MCP server authenticates with a token tied to your account. There is no token page yet, so
27
- you mint one with your browser session:
28
-
29
- 1. In the browser where you signed in, open the developer tools, then Application (Storage in
30
- Firefox) → Cookies → `https://subseam.theconstructory.com`, and copy the value of
31
- `__Host-subseam_session`.
32
- 2. Run, pasting that value:
26
+ The MCP server authenticates with a token tied to your account. Open
27
+ <https://subseam.theconstructory.com/settings>, signed in as in step 1, name the token after the
28
+ machine it is for, and create it. The page shows the token once: copy it, then run
33
29
 
34
30
  ```
35
- S='<the cookie value>'; C=$(openssl rand -hex 16)
36
- mkdir -p ~/.subseam && curl -s -X POST https://subseam.theconstructory.com/tokens \
37
- -H "cookie: __Host-subseam_session=$S; subseam_csrf=$C" -H "x-csrf-token: $C" \
38
- -H 'content-type: application/json' -d '{"label":"my-machine"}' \
39
- | node -e 'let b="";process.stdin.on("data",d=>b+=d).on("end",()=>{let t;try{t=JSON.parse(b).token}catch{}if(typeof t==="string")process.stdout.write(t);else{console.error("subseam refused the token request: "+b);process.exit(1)}})' > ~/.subseam/token
40
- chmod 600 ~/.subseam/token
31
+ mkdir -p ~/.subseam && umask 077 && printf '%s' '<the token>' > ~/.subseam/token
41
32
  ```
42
33
 
43
- `~/.subseam/token` now holds one line starting `cpt_`. If the command prints "subseam refused the
44
- token request" with the server's answer, the session cookie was wrong or expired: sign in again and
45
- repeat. The server also accepts the token in the
46
- `SUBSEAM_TOKEN` environment variable instead of the file.
34
+ `~/.subseam/token` now holds one line starting `cpt_`. The server also accepts the token in the
35
+ `SUBSEAM_TOKEN` environment variable instead of the file. The same page lists your tokens and
36
+ revokes one you no longer use.
47
37
 
48
38
  ## 3. Install
49
39
 
@@ -57,7 +47,7 @@ npm install @subseam/mcp
57
47
  For Claude Code:
58
48
 
59
49
  ```
60
- claude mcp add-json --scope user subseam '{"command":"node","args":["'"$HOME"'/.subseam/mcp/node_modules/@subseam/mcp/dist/main.js"],"env":{"SUBSEAM_URL":"https://subseam.theconstructory.com/subseam"}}'
50
+ claude mcp add-json --scope user subseam '{"command":"node","args":["'"$HOME"'/.subseam/mcp/node_modules/@subseam/mcp/dist/main.js"],"env":{"SUBSEAM_URL":"https://subseam.theconstructory.com"}}'
61
51
  ```
62
52
 
63
53
  `claude mcp list` should show `subseam ... Connected`. Any other MCP host: run
package/dist/main.js CHANGED
@@ -24036,7 +24036,7 @@ function requireEnv(env, name, purpose) {
24036
24036
  function loadConfig2(env = process.env, sources = realTokenSources()) {
24037
24037
  return Object.freeze({
24038
24038
  get url() {
24039
- return requireEnv(env, "SUBSEAM_URL", "to reach the hosted service, e.g. https://subseam.theconstructory.com/subseam");
24039
+ return requireEnv(env, "SUBSEAM_URL", "to reach the hosted service, e.g. https://subseam.theconstructory.com");
24040
24040
  },
24041
24041
  get tenantId() {
24042
24042
  const value = env["SUBSEAM_TENANT"];
@@ -31929,19 +31929,22 @@ var defineProposalReadTool = {
31929
31929
  init_esm_shims();
31930
31930
  var input9 = external_exports.object({
31931
31931
  taskId: external_exports.string().uuid(),
31932
- sha: external_exports.string().regex(/^[0-9a-f]{40}$/),
31933
- gitDir: external_exports.string().startsWith("/")
31932
+ files: external_exports.array(external_exports.object({ path: external_exports.string().min(1), content: external_exports.string().nullable() })).min(1).optional(),
31933
+ sha: external_exports.string().regex(/^[0-9a-f]{40}$/).optional(),
31934
+ gitDir: external_exports.string().startsWith("/").optional()
31934
31935
  });
31935
31936
  var site2 = external_exports.object({ definitionName: external_exports.string(), path: external_exports.string(), line: external_exports.number(), cause: external_exports.string() });
31936
31937
  var siteLine2 = (d) => ` ${d.definitionName} at ${d.path}:${d.line} \u2014 ${d.cause}`;
31937
31938
  var defineProposalCheckTool = {
31938
31939
  name: "define_proposal_check",
31939
- description: "Before submitting a fill for a PR-check proposal, ask what the check would say about your candidate: commit your worktree on the PR head (git write-tree, then git commit-tree <tree> -p <headSha>) and pass that sha with your git directory. Answers the divergences still standing at the candidate, the ones it closes and the ones it opens. Records nothing.",
31940
+ description: "Before submitting a fill for a PR-check proposal, ask what the check would say about your candidate: pass `files`, the same file-set you would submit with tasks_submit ({path, content} each; content null deletes the file). Answers the divergences still standing at the candidate, the ones it closes and the ones it opens. Records nothing.",
31940
31941
  capability: "decision",
31941
31942
  inputSchema: input9.shape,
31942
31943
  async handler(raw, ctx) {
31943
31944
  const args2 = input9.parse(raw);
31944
- const wire = await ctx.gateway.invoke("decision-proposal-check", args2);
31945
+ const candidate = args2.files !== void 0 ? { taskId: args2.taskId, files: args2.files } : args2.sha !== void 0 && args2.gitDir !== void 0 ? { taskId: args2.taskId, sha: args2.sha, gitDir: args2.gitDir } : null;
31946
+ if (candidate === null) return { text: "define_proposal_check: pass `files`, the file-set you would submit as the fill." };
31947
+ const wire = await ctx.gateway.invoke("decision-proposal-check", candidate);
31945
31948
  const body2 = readBody(
31946
31949
  external_exports.object({
31947
31950
  delta: external_exports.object({
@@ -48341,7 +48344,7 @@ var workReadTools = createWorkReadToolProviders({ capability: "work" });
48341
48344
  var bundledProviders = [src_default2, src_default, tension_default, ...defineTools, ...decisionTools, ...captureTools, ...buildTools, secureTool, ...workTools, ...workReadTools];
48342
48345
 
48343
48346
  // package.json
48344
- var version2 = "0.4.14";
48347
+ var version2 = "0.4.16";
48345
48348
 
48346
48349
  // src/server.ts
48347
48350
  var SERVER_VERSION = version2;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subseam/mcp",
3
- "version": "0.4.14",
3
+ "version": "0.4.16",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {