KSEI MCP
# KSEI
[](https://opensource.org/licenses/MIT)
A Python client library and **Model Context Protocol (MCP)** server for accessing your [AKSes KSEI](https://akses.ksei.co.id) (Acuan Kepemilikan Sekuritas Kustodian Sentral Efek Indonesia) portfolio data.
Retrieve complete Indonesian securities portfolio information:
* ๐ต Cash balances (RDN)
* ๐ Equity holdings (Saham)
* ๐ Mutual funds (Reksadana)
* ๐ Bonds (Obligasi & SBN)
* ๐ผ Other investment instruments
* ๐ค Account identity & SID
---
## ๐ง Prerequisites
* Python 3.11 or higher
* Valid KSEI account credentials
* [`uv`](https://docs.astral.sh/uv/getting-started/installation/) (recommended for fast package management)
---
## โ๏ธ Configuration
Set your KSEI credentials via environment variables or a `.env` file:
```bash
export KSEI_USERNAME="your_ksei_username"
export KSEI_PASSWORD="your_ksei_password"
# Optional: Override token cache location (defaults automatically to ~/.cache/ksei)
# export KSEI_AUTH_PATH="/custom/path"
```
---
## ๐ Usage
### 1. As a Python Library
Tokens are automatically cached in `~/.cache/ksei` with restricted `0o700`/`0o600` permissions.
```python
import asyncio
from ksei import KSEIClient
# Initialize client (no auth_store boilerplate needed!)
client = KSEIClient(username="your_username", password="your_password")
# Synchronous usage
summary = client.get_portfolio_summary()
cash = client.get_cash_balances()
equities = client.get_equity_balances()
funds = client.get_mutual_fund_balances()
bonds = client.get_bond_balances()
# Asynchronous usage (fast parallel fetch)
async def main():
async with KSEIClient(username="your_username", password="your_password") as client:
all_portfolios = await client.get_all_portfolios_async()
print(all_portfolios)
asyncio.run(main())
```
---
### 2. As an MCP Server (for AI Assistants)
#### Quick Run with `uvx`
```bash
# Run directly with uvx
uvx ksei-mcp
# Or run from local checkout
uvx --from . ksei-mcp
```
#### MCP Client Configuration
Add this configuration to your MCP client (Claude Desktop, Cursor, Gemini CLI, etc.):
```json
{
"mcpServers": {
"ksei": {
"type": "stdio",
"command": "uvx",
"args": ["ksei-mcp"],
"env": {
"KSEI_USERNAME": "your_ksei_username",
"KSEI_PASSWORD": "your_ksei_password"
}
}
}
}
```
---
### 3. CLI Commands
```bash
# Start MCP server
uv run ksei mcp
# Fetch and dump raw portfolio JSON
uv run ksei dump --output ./data
```
---
## ๐งช Testing with MCP Inspector
For local MCP debugging:
```bash
npx @modelcontextprotocol/inspector uv run ksei-mcp
```
---
## ๐ Security & Privacy
* **Zero Boilerplate Cache**: Tokens are cached automatically in `~/.cache/ksei` (XDG standard) with user-only permissions (`0o700` directory, `0o600` files).
* **Secret Protection**: Passwords and tokens are never logged or exposed in `__repr__` or unhandled exceptions.
* **Auto 401 Recovery**: The client transparently refreshes expired tokens on 401 Unauthorized responses.
* **Secure Transport**: All requests communicate with official KSEI endpoints via HTTPS.
---
## ๐ License
Licensed under the MIT License. See [LICENSE](./LICENSE) for details.
---
## โ ๏ธ Disclaimer
This is an **unofficial client** for educational and personal use only. It is not affiliated with or endorsed by PT Kustodian Sentral Efek Indonesia (KSEI).
### Acknowledgement
Adapted and inspired by [chickenzord/goksei](https://github.com/chickenzord/goksei).
TDQS
Scored across 8 tools
Each tool targets a distinct aspect of the KSEI account: identity, summary, specific asset classes (cash, equity, mutual funds, bonds, other), and an aggregate fetch. No overlap between tools, and get_all_portfolios is explicitly a parallel convenience.
All tools follow the same get_<object>_<detail> pattern with snake_case. Names are uniform and predictable, making it easy for an agent to infer function from name alone.
8 tools is well-scoped for a read-only portfolio information server. Each tool covers a meaningful scope, and the count is neither too thin nor excessive.
The server covers all major asset classes and provides identity, summary, and full portfolio retrieval. Minor gaps like transaction history or historical performance exist, but the core read-only portfolio surface is well covered.