aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-02 18:24:08 -0500
committerCraig Jennings <c@cjennings.net>2026-06-02 18:24:08 -0500
commitd2aaf86012060a1a70e7344470b9bff02b2fc422 (patch)
tree48188496b1df9fcfedce02e9fdd3a086ab76813d
parent3a06aff7eec20814f6b51b72691f4140668189c2 (diff)
downloadrulesets-d2aaf86012060a1a70e7344470b9bff02b2fc422.tar.gz
rulesets-d2aaf86012060a1a70e7344470b9bff02b2fc422.zip
docs(mcp): note signal-cli + Google Voice dependency for signal-mcp
-rw-r--r--mcp/README.org12
-rw-r--r--todo.org5
2 files changed, 15 insertions, 2 deletions
diff --git a/mcp/README.org b/mcp/README.org
index c8cb49a..30dc082 100644
--- a/mcp/README.org
+++ b/mcp/README.org
@@ -79,3 +79,15 @@ A Google refresh token dies when scopes are re-granted, the Connected App is rem
- *HTTP/SSE servers* (=linear=, =notion=) carry their own hosted OAuth — the first tool call in a session triggers an in-client auth flow; nothing local to cache. If a connection fails, it is usually an expired in-client grant, re-authorized from the client, not from this pipeline.
- *stdio servers needing OAuth* (=google-docs-*=, =google-calendar=) cannot run an interactive browser flow under Claude Code's stdio loader. They depend on a *pre-seeded* token/keys file on disk — which is exactly why the installer materializes them from the bundle. A "Failed to connect" on one of these almost always means the on-disk token cache is missing or stale; rotate it (above) rather than re-running the server by hand.
+
+* Signal MCP — local signal-cli dependency
+
+The =signal-mcp= server (rymurr/signal-mcp, cloned to =~/.local/share/signal-mcp= with a =uv=-built =.venv=) wraps a locally-installed =signal-cli=. Unlike the OAuth servers, it carries no secret in the bundle — its only config is the =--user-id= it runs as, which is set in =servers.json=.
+
+Prerequisites on a fresh machine, in order:
+
+1. Install =signal-cli= (AUR: =signal-cli=; needs a JRE 21+).
+2. Register the dedicated pager account. Signal requires a captcha for registration: run =signal-cli -a +<number> register=, follow the printed =signalcaptchas.org= link, solve it, and pass the resulting token to =signal-cli -a +<number> register --captcha <token>= within a minute or two before it expires. Signal then texts a code to the number; verify with =signal-cli -a +<number> verify <code>=.
+3. =make install-mcp= registers =signal-mcp= pointed at that =--user-id=.
+
+The =--user-id= is a *dedicated* number (a Google Voice number registered to =signal-cli=), not Craig's primary. Signal mobile won't push-notify a message an account sends to itself, so paging from the primary to itself is silent; a distinct sender account reaching Craig's account notifies normally. Craig's account hides its phone number under phone-number privacy, so the destination is its stable account UUID rather than a number. The same account and recipient back the =page-signal= CLI wrapper (=PAGE_SIGNAL_ACCOUNT= / =PAGE_SIGNAL_TO=). The MCP server is the two-way path (=receive_message= to listen for replies); =page-signal= is the fast send-only path.
diff --git a/todo.org b/todo.org
index 769ee9b..4cd7b9a 100644
--- a/todo.org
+++ b/todo.org
@@ -67,12 +67,13 @@ Pearl recommends a one-page spec (problem + design + open questions + acceptance
*** 2026-05-28 Thu @ 08:12:55 -0500 Pearl shipped patterns 4-6, filed alongside the prior two
Three more pearl handoffs landed and were filed during this audit. Filed: [[file:docs/design/2026-05-28-pattern-catalog-prompt-labels-and-defaults.org][prompt-labels-and-defaults]] (patterns 4-5: label-matches-behavior, default-most-common with friction-proportional-to-consequence) and [[file:docs/design/2026-05-28-pattern-catalog-prompt-collapse.org][prompt-collapse]] (pattern 6: collapse N orthogonal prompts into one enriched prompt). The catalog's evidence base is now four pearl notes in =docs/design/= covering six patterns plus the synthesizing principle Pearl articulated — "choices on screen, accurately labeled, ordered by what the user most often wants, friction sized to the cost of being wrong."
-** TODO [#B] Add Signal MCP server (rymurr/signal-mcp) :feature:
-SCHEDULED: <2026-05-29 Fri>
+** DONE [#B] Add Signal MCP server (rymurr/signal-mcp) :feature:
+CLOSED: [2026-06-02 Tue]
:PROPERTIES:
:CREATED: [2026-05-29 Fri]
:LAST_REVIEWED: 2026-05-29
:END:
+Done 2026-06-02. Registered signal-cli to the Google Voice pager account, added the signal-mcp entry to servers.json, installed via make install-mcp (claude mcp list shows it connected), and documented the signal-cli + GV dependency in mcp/README.org. The GV-registration dependency this task flagged is resolved. Shipped in cfaff12 (page-signal routing) and this commit (README).
Install [[https://github.com/rymurr/signal-mcp][rymurr/signal-mcp]] so Claude can call =send_message_to_user=, =send_message_to_group=, and =receive_message= natively rather than shelling out to the =page-signal= wrapper. Python, MCP framework, depends on =signal-cli= being configured locally.