Munim
One MCP server holding a live session with every client's account at once.
A coding agent can be logged in to one Cloudflare account. One Vercel. One Resend. Connect a second client and the first goes away. So the person looking after a dozen small businesses runs a dozen agent sessions, and none of them can answer a question about more than one client.
Munim holds them all. Each client gets its own registration with the provider, its own token and its own namespace in the tool list, so one agent can read across every client and write inside the one you named.
Kloudfirst -> Kloudfirst@gmail.com's Account (3 tools)
Balaji Roofings -> Tech.bajajiroofing@gmail.com's Account (3 tools)
both sessions opened concurrently, one process, no logout
That is a real run against two real Cloudflare accounts, not a diagram.
Reproduce it with your own two:
scripts/cross_account_probe.py.
Install
Requires Python 3.10+. Nothing else: no Node, no build step, no account to create first.
uv tool install munim # or: pipx install munim, or: pip install munim
claude mcp add munim -- munim-mcp
Start
munim clients # who you look after, and what is connected
munim clients add "Ivy & Fern" # write one down, connect nothing yet
munim connect "Ivy & Fern" cloudflare # a browser opens; that is the whole setup
There is no wrong order. Connect first and the account you sign in to names the client, or write the client down first and connect whenever. Both arrive in the same place.
Then ask your coding agent something a single logged-in session cannot answer:
which of my clients has a domain expiring this quarter?
check ivyandfern.co.uk for Ivy & Fern Studio
A model is only needed for the tools that reason (check, work_on_client,
ask_across_clients). Any Strands-supported host works:
mkdir -p ~/.munim && echo "GEMINI_API_KEY=..." >> ~/.munim/.env
munim doctor says what is set up, what is not, and the exact command to fix
each gap. Start there whenever something is unclear.
Documentation
| Commands | the whole CLI |
| Tools | what your coding agent gets, and what it deliberately cannot do |
| Providers | a page each: setup, what connecting grants, what is verified |
| Architecture | how it is built, and the four decisions that shape it |
| Decisions | every design decision and its reasoning, including the wrong ones |
| Roadmap | what is not done, and why |
| Development | running the tests, and reproducing the claim above |
Why this exists
One person maintains the web and email setup of a dozen small businesses. The clients own the accounts; the operator holds delegated access and does the work. Every provider allows one login at a time, so the workaround is a separate agent session per client.
The costly part is not the switching. It is that a mistake in mail setup breaks nothing visible. Get an A record wrong and the site is down in minutes. Get the SPF record wrong and the client's invoices quietly stop arriving, and nobody notices for weeks.
A munim is the steward a business owner trusts to keep their books and handle their affairs without being asked each time.
Disclosure
Built with AI assistance (Claude Code), which the hackathon rules permit. No pre-existing code was incorporated; the repository was created during the submission period.
Licence
MIT. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file munim-0.2.0.tar.gz.
File metadata
- Download URL: munim-0.2.0.tar.gz
- Upload date:
- Size: 611.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c82c3d6e6fec07d47f94b003d22fdd42941f1f4d08c680a9a201086af5c7e74d
|
|
| MD5 |
ef24bb1cd5de68314a7adb7a7cba6afd
|
|
| BLAKE2b-256 |
c1682fb0309a480a94b5601bcafec730d629df91ce1c5fa52cb5753c0c222751
|
Provenance
The following attestation bundles were made for munim-0.2.0.tar.gz:
Publisher:
publish.yml on vishalsg42/munim
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
munim-0.2.0.tar.gz -
Subject digest:
c82c3d6e6fec07d47f94b003d22fdd42941f1f4d08c680a9a201086af5c7e74d - Sigstore transparency entry: 2713184331
- Sigstore integration time:
-
Permalink:
vishalsg42/munim@8d0b6ce030e228bb95f86b5164f26a5e94e236d2 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/vishalsg42
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8d0b6ce030e228bb95f86b5164f26a5e94e236d2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file munim-0.2.0-py3-none-any.whl.
File metadata
- Download URL: munim-0.2.0-py3-none-any.whl
- Upload date:
- Size: 116.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
328c739d58d8199e5bd883541a927502dd09f1fbbf6d0b9f4977b7a265a3e3f9
|
|
| MD5 |
18a2369fb6350314429f73ad100e1b10
|
|
| BLAKE2b-256 |
eb07922fb44c476636a8f3c25edaa3a716136740a7e97b1bb5ffb27fbae4b1b1
|
Provenance
The following attestation bundles were made for munim-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on vishalsg42/munim
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
munim-0.2.0-py3-none-any.whl -
Subject digest:
328c739d58d8199e5bd883541a927502dd09f1fbbf6d0b9f4977b7a265a3e3f9 - Sigstore transparency entry: 2713184398
- Sigstore integration time:
-
Permalink:
vishalsg42/munim@8d0b6ce030e228bb95f86b5164f26a5e94e236d2 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/vishalsg42
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8d0b6ce030e228bb95f86b5164f26a5e94e236d2 -
Trigger Event:
push
-
Statement type: