@@ -6,7 +6,7 @@ Personal AI tooling stack: Podman Compose services for MCP servers, plus Claude
66
77| Service | Port | Description |
88| ---| ---| ---|
9- | ai-beacon | 17090 | Knowledge base / prompt library UI |
9+ | ai-beacon | 17090 | Session manager for multiple Claude sessions |
1010| devlake-local-mysql-mcp | 17301 | Read-only MCP proxy for local DevLake MySQL |
1111| devlake-prod-mysql-mcp | 17300 | Read-only MCP proxy for remote Konflux RDS |
1212| gmail-mcp | 17633 | Gmail MCP server (search, draft, attachments) |
@@ -32,27 +32,31 @@ podman compose up -d gmail-mcp mcp-atlassian
3232
3333Container images are built by CI and published to ` ghcr.io/kpiwko/ ` — no local build needed.
3434
35- ## Plugins
35+ ## Getting started with Claude Code
3636
37- Claude Code plugins live in ` plugins/ ` . Install them once inside Claude Code :
37+ Install the ai-stack plugin once :
3838
3939```
40- /plugin install dev@kpiwko/ai-stack
41- /plugin install track@kpiwko/ai-stack
42- /plugin install quarterly@kpiwko/ai-stack
40+ claude plugin install ai-stack@kpiwko/ai-stack
4341```
4442
45- Third-party plugins and bare skills are tracked in ` plugins.yaml ` . See ` just install-plugins ` and ` just install-skills ` .
43+ Then use it inside a Claude session to set up everything else:
44+
45+ ```
46+ /ai-stack:install-plugins ← install dev, track, quarterly plugins
47+ /ai-stack:install-skills ← install bare skills (template-slide-deck, n8n-skills)
48+ /ai-stack:install-mcps ← register MCP servers with Claude Code
49+ ```
50+
51+ All three commands are interactive: they show what's available, what's already installed,
52+ and let you pick scope (user / project / local) before making any changes.
4653
4754## Just recipes
4855
4956``` bash
50- just install-plugins # print /plugin install commands for Claude Code
51- just install-skills # fetch and install bare skills from plugins.yaml (requires: yq, git)
52- just check-images # verify compose.yaml uses no localhost/ images
53- just up # podman compose up -d
54- just down # podman compose down
55- just status # podman compose ps
57+ just up # podman compose up -d
58+ just down # podman compose down
59+ just status # podman compose ps
5660```
5761
5862## gmail-mcp
@@ -64,62 +68,42 @@ reused automatically. On first run, authorize via browser:
6468open http://localhost:17633/auth # complete Google Device Authorization
6569```
6670
67- Register with Claude Code once:
68-
69- ``` bash
70- claude mcp add --transport http --scope user gmail http://localhost:17633/mcp
71- ```
71+ Then register with Claude Code via ` /ai-stack:install-mcps ` .
7272
7373## devlake-local-mysql-mcp
7474
75- Connects to a DevLake MySQL instance running on the host at port 3306. Start DevLake first:
76-
77- ``` bash
78- cd ~ /devel/work/devlake
79- podman compose -f docker-compose-dev.yml up -d mysql
80- ```
81-
82- Then start the MCP proxy:
83-
84- ``` bash
85- podman compose up -d devlake-local-mysql-mcp
86- ```
87-
88- ## Registering MCP servers with Claude Code
75+ Connects to a DevLake MySQL instance running on the host at port 3306. Start DevLake's
76+ MySQL service first, then register this MCP via ` /ai-stack:install-mcps ` . The command
77+ reads ` $DEVLAKE_MCP_SECRET_KEY ` from the environment — make sure ` .env ` is sourced first.
8978
90- MySQL MCPs carry secrets and are registered ** project-local** (` --scope local ` ), which writes
91- to ` .claude/settings.local.json ` (gitignored). Run from the project that needs DB access:
79+ ** Optional: connect via shared Podman network instead of host port**
9280
93- ``` bash
94- source ~ /devel/local-ai/.env
81+ If DevLake runs in Podman Compose with a named network, you can attach this service to
82+ that network and reach MySQL by container name — no host port exposure needed.
9583
96- claude mcp add --transport http --scope local devlake-prod-mysql-mcp \
97- http://localhost:17300/mcp \
98- --header " Authorization: Bearer ${KONFLUX_MCP_SECRET_KEY} "
84+ 1 . Find DevLake's network name: ` podman network ls `
9985
100- claude mcp add --transport http --scope local devlake-local-mysql-mcp \
101- http://localhost:17301/mcp \
102- --header " Authorization: Bearer ${DEVLAKE_MCP_SECRET_KEY} "
103- ```
86+ 2 . Declare it as external in ` compose.yaml ` :
87+ ``` yaml
88+ networks :
89+ ai-stack :
90+ driver : bridge
91+ devprod : # replace with DevLake's actual network name
92+ external : true
93+ ` ` `
10494
105- Verify a server is responding before registering:
106-
107- ``` bash
108- curl -s -X POST http://localhost:17300/mcp \
109- -H " Authorization: Bearer ${KONFLUX_MCP_SECRET_KEY} " \
110- -H " Content-Type: application/json" \
111- -H " Accept: application/json, text/event-stream" \
112- -d ' {"jsonrpc":"2.0","method":"tools/list","id":1}'
113- ```
95+ 3. Add the network to the service and update ` MYSQL_HOST` to the MySQL container name:
96+ ` ` ` yaml
97+ devlake-local-mysql-mcp:
98+ networks: [ai-stack, devprod]
99+ environment:
100+ MYSQL_HOST: mysql # replace with DevLake's MySQL container name
101+ ` ` `
114102
115103# # mcp-atlassian (Jira)
116104
117- ``` bash
118- podman compose up -d mcp-atlassian
119- claude mcp add --transport http --scope user mcp-atlassian http://localhost:17000/mcp
120- ```
121-
122- Credentials come from ` .env ` : ` JIRA_URL ` , ` JIRA_USERNAME ` , ` JIRA_API_TOKEN ` .
105+ Credentials come from `.env` : ` JIRA_URL` , `JIRA_USERNAME`, `JIRA_API_TOKEN`. Start the
106+ service then register via `/ai-stack:install-mcps`.
123107
124108# # gdrive-mcp (Google Drive)
125109
@@ -131,11 +115,7 @@ npx @piotr-agier/google-drive-mcp auth
131115` ` `
132116
133117This writes `credentials.json` and `tokens.json` into `~/.config/google-drive-mcp/`.
134-
135- ``` bash
136- podman compose up -d gdrive-mcp
137- claude mcp add --transport http --scope user gdrive http://localhost:17100/mcp
138- ```
118+ Then start the service and register via `/ai-stack:install-mcps`.
139119
140120# # OpenShell sandboxes
141121
0 commit comments