# IAM MCP SERVER ... kind of π€
[![PyPI][pypi-badge]][pypi-url]
[![MIT licensed][mit-badge]][mit-url]
[![Python Version][python-badge]][python-url]
**The Individual Applicant Mesh (IAM) MCP Server is designed to process and manage applicant resumes, as well as facilitate job searches. It offers specialized tools and prompts for job searching, resume aggregation, generating job-specific resumes, and creating tailored cover letters.**
[pypi-badge]: https://img.shields.io/pypi/v/mcp.svg
[pypi-url]: https://pypi.org/project/iam-mcp-server/
[mit-badge]: https://img.shields.io/pypi/l/mcp.svg
[mit-url]: https://github.com/alejandrogarcia-hub/iam-mcp-server/blob/main/LICENSE
[python-badge]: https://img.shields.io/pypi/pyversions/mcp.svg
[python-url]: https://www.python.org/downloads/
**Note: This server does not fully handle system integrations. Instead, it provides focused functionality specifically for an MCP hostβhence the "kind of π€".**
> π‘ **Community & Support**
> If you found this project helpful, please consider giving it a star βοΈ. Found a bug or have suggestions? Open an issueβyour feedback is welcome!
## π Quickstart
### 1. Use Claude Desktop as MCP host
The IAM MCP Server is designed to work with Claude Desktop, which provides the necessary MCP host environment. For more details on setting up Claude Desktop with MCP, see the [official MCP quickstart guide](https://modelcontextprotocol.io/quickstart/user).
### 2. Add filesystem MCP server
Add the `filesystem` MCP server to Claude Desktop to enable file system access (see Requirements section below for configuration example).
### 3. Get JSearch API token
Create a free account at [JSearch](https://rapidapi.com/letscrape-6bRBa3QguO5/api/jsearch) to get your API token (200 free requests/month).
β οΈ **Note:** This step is optional. You can let the MCP host or another MCP server handle job searches instead.
### 4. Configure IAM MCP Server
Add the following to your Claude Desktop configuration to run the server directly from PyPI using `uvx`:
```json
{
"mcpServers": {
"iam": {
"command": "uvx",
"args": [
"--from",
"iam-mcp-server@latest",
"mcp-server-iam"
],
"env": {
"LOG_LEVEL": "INFO",
"RAPIDAPI_KEY": "<YOUR_API_KEY>",
"RAPIDAPI_HOST": "jsearch.p.rapidapi.com",
"MCP_TRANSPORT": "stdio"
}
}
}
}
```
------------
> **π Ready to start using IAM MCP Server?**
> Check out the [Features](#-features) section to learn how to use the available tools and prompts.
## π Requirements
1. ποΈ The MCP host must have read and write access to the local file system where it is running. For example, you can run the `IAM MCP Server` within `Claude Desktop`, alongside the `filesystem` MCP Server, which provides this capability. This file access requirement applies to version `1.0` and is necessary for proper operation.
1.1. Add the `filesystem` MCP server
```json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"<add directory for filesystem server>"
]
}
}
}
```
2. π The `search job` MCP tool requires access to [JSearch](https://rapidapi.com/letscrape-6bRBa3QguO5/api/JSearch). You can create an account and get 200 requests per month for free.
## β¨ Features
### Prompts
#### π Analyze Job Market
Directs the LLM step-by-step to perform tasks such as conducting a `job search`, then summarizes and analyzes the resulting job listings. Refer to the full prompt for detailed instructions and context.
#### π Resume Mesh
Easily combine multiple targeted resumes into a single, comprehensive Markdown document.
**What is Resume Mesh?**
If youβve applied to similar jobs, youβve likely created several versions of your resume to match different job descriptions. Resume Mesh brings all those versions together into one unified Markdown file. This gives the MCP host a complete view of your experience and makes it easy to generate new, tailored resumes for future applications.
#### π― Job-Specific Resume Generation
Generate customized resumes for individual job postings.
To use this feature, make sure the MCP host already has access to the `resume mesh`. Each tailored resume is generated using both the resume mesh and the specific job description. You need to attach the `resume mesh` to the MCP host conversation in advance, because the resume generation prompt does not instruct the LLM to load the `resume mesh` from the file system.
#### Cover-Letter Generation
Easily generate a customized cover letter tailored to a specific job description, using the corresponding generated resume.
**How to use:**
Before generating a cover letter, ensure the MCP host has access to the relevant generated `resume` for the target job. You must manually attach this `resume` to the MCP host conversation, as the cover letter prompt does not automatically retrieve it from the file system.
#### πΎ Save Job
Directs the LLM step-by-step to `save jobs`.
**How to use:**
Start by searching for jobs using the `search jobs` MCP tool. After obtaining the results, you can then instruct the LLM to save those job listings.
### Tools
#### π Search Jobs
Performs a job search using the following parameters:
- role: The job title or position to search for
- city: (optional) Target city for the job search
- country: (optional) Target country for the job search
- platform: (optional) Specific job platform to use
- number of jobs: (default 5) Number of job listings to retrieve
- slice job description: (optional) Option to include only a portion of the job description
## π οΈ Installation & Setup
The IAM MCP Server can be installed in multiple ways:
### π¦ Desktop Extension (DXT) - Recommended
**One-click installation for MCP hosts!** DXT (Desktop Extension) format provides the easiest way to install and use the IAM MCP Server.
#### Why DXT?
Desktop Extensions eliminate the complexity of manual MCP server setup by bundling everything into a single installable package:
- **No Python installation required** - All dependencies included
- **One-click installation** - Just like browser extensions
- **Automatic updates** - MCP hosts can manage updates
- **Cross-platform** - Works on macOS, Windows, and Linux
- **Self-contained** - No environment conflicts
#### Download Latest DXT
Get the latest pre-built DXT file from our GitHub releases:
**[π₯ Download Latest DXT β](https://github.com/alejandrogarcia-hub/iam-mcp-server/releases/latest)**
### π³ Container Sidecar
Build a self-contained image and run it alongside your MCP host:
```bash
# Build image using published wheel (set APP_VERSION to released tag)
docker build --no-cache --build-arg APP_VERSION=2.1.0 -t iam-mcp-server:2.1.0 .
# For local source builds, omit APP_VERSION or pass APP_VERSION=local
docker build -t iam-mcp-server:dev .
# Start the server with a writable data volume and required secrets
docker run --rm \
--name iam-mcp-server \
-e RAPIDAPI_KEY=your_rapidapi_key \
-e LOG_LEVEL=INFO \
-e MCP_TRANSPORT=stdio \
-v $(pwd)/data:/data \
iam-mcp-server:2.1.0
# OR
docker run --rm -i \
-e RAPIDAPI_KEY="your-api-key-here" \
-e LOG_LEVEL=DEBUG \
-v $(pwd)/data:/data \
iam-mcp-server:dev
# Interactive stdio communication with Docker
When running the container interactively, you can send JSON-RPC messages directly:
```bash
# Start the container in interactive mode
docker run -i --rm ghcr.io/alejandrogarcia-hub/iam-mcp-server:latest
# 1. Initialize the server (send this JSON and press Enter)
{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"0.1.0","capabilities":{},"clientInfo":{"name":"client","version":"1.0.0"}},"id":1}
# 2. Send initialized notification
{"jsonrpc":"2.0","method":"notifications/initialized","params":{"capabilities":{}}}
# 3. List available prompts
{"jsonrpc":"2.0","method":"prompts/list","params":{},"id":2}
# 4. List available tools
{"jsonrpc":"2.0","method":"tools/list","params":{},"id":3}
# 5. Graceful shutdown (optional - see note below)
{"jsonrpc":"2.0","id":4,"method":"shutdown"}
# Server responds with: {"jsonrpc":"2.0","id":4,"result":null}
# 6. Exit notification
{"jsonrpc":"2.0","method":"exit"}
```
**Note on Shutdown:** While MCP supports graceful shutdown via `shutdown` request followed by `exit` notification, in practice:
- **Ctrl+C** immediately terminates the container (SIGINT) - fast but not graceful
- **Ctrl+D** sends EOF to close stdin - cleaner than Ctrl+C
- **Graceful shutdown sequence** allows the server to properly clean up resources, save state, and acknowledge before terminating
The graceful shutdown is particularly important in production environments where the server might be handling ongoing operations or needs to persist state before terminating.
```
#### Production Deployment with Kubernetes
For production environments, deploy the MCP server to Kubernetes and connect via HTTP/SSE:
##### Step 1: Deploy to Kubernetes
```bash
# Deploy to local Docker Desktop Kubernetes
./ops/k8s/deploy-local.sh
# Or deploy to production cluster
kubectl apply -k ops/k8s/
```
After deployment, the server will be accessible at:
- **Local**: `http://localhost:9999` (with port-forward)
- **Production**: Your configured ingress URL
##### Step 2: Configure Claude Desktop for Kubernetes Connection
Claude Desktop supports HTTP/SSE MCP servers through **Settings > Connectors** (Pro, Max, Team, and Enterprise plans):
**For Local Kubernetes Deployment:**
1. Ensure the server is deployed and port-forward is active:
```bash
./ops/k8s/deploy-local.sh
# This will set up port-forward on localhost:9999
```
2. Open Claude Desktop and navigate to **Settings > Connectors**
3. Click **"Add custom connector"** at the bottom
4. Enter the MCP server URL:
- For local Kubernetes: `http://localhost:9999`
- For production Kubernetes: `https://your-mcp-server.domain.com`
5. (Optional) Configure authentication in **"Advanced settings"**
6. Click **"Add"** to save
**Important Notes:**
- HTTP/SSE connectors are configured via Settings > Connectors, NOT in `claude_desktop_config.json`
- This feature is currently in beta
- For local Kubernetes, ensure `kubectl port-forward` is running (the deploy script handles this)
- The server uses SSE for streaming responses back to Claude Desktop
##### Step 3: Test HTTP/SSE Connection
The HTTP/SSE transport works differently than stdio. Here's how to test it:
**Step 1:** First, establish SSE connection to get session ID:
```bash
# Connect to SSE endpoint and get the session ID
curl -N -H "Accept: text/event-stream" "http://localhost:9999/sse"
# Response will include: data: /messages/?session_id=YOUR_SESSION_ID
```
**Step 2:** Initialize the MCP session (two-step process):
```bash
# Step 1: Send initialize request
curl -X POST "http://localhost:9999/messages/?session_id=YOUR_SESSION_ID" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"0.1.0","capabilities":{"prompts":{},"tools":{}},"clientInfo":{"name":"test-client","version":"1.0.0"}},"id":1}'
# Response: "Accepted" (actual response comes via SSE)
# Step 2: Send initialized notification
curl -X POST "http://localhost:9999/messages/?session_id=YOUR_SESSION_ID" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"notifications/initialized","params":{"capabilities":{}}}'
# Response: "Accepted"
```
**Step 3:** List available prompts and tools:
```bash
# List prompts
curl -X POST "http://localhost:9999/messages/?session_id=YOUR_SESSION_ID" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"prompts/list","params":{},"id":2}'
# Response: "Accepted" (actual list comes via SSE)
# List tools
curl -X POST "http://localhost:9999/messages/?session_id=YOUR_SESSION_ID" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","params":{},"id":3}'
# Response: "Accepted" (actual list comes via SSE)
```
**Note:** All HTTP POST requests return "Accepted" immediately. The actual MCP responses are streamed through the SSE connection.
#### Local Development with Docker
For local development without Kubernetes, use Docker with stdio transport:
```json
{
"mcpServers": {
"iam-docker": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"--name", "iam-mcp-claude",
"-e", "RAPIDAPI_KEY=your_api_key",
"-e", "LOG_LEVEL=INFO",
"-e", "MCP_TRANSPORT=stdio",
"-v", "/path/to/data:/data",
"iam-mcp-server:latest"
]
}
}
}
```
**Important notes:**
- Container must run in interactive mode (`-i`) for stdio transport
- Use `--rm` to clean up containers after disconnection
- Mount a volume (`-v`) to persist data between sessions
- Replace `/path/to/data` with your actual data directory
#### Test the container
```bash
echo '{"jsonrpc": "2.0", "method": "initialize", "params": {"protocolVersion": "0.1.0", "capabilities": {},
"clientInfo": {"name": "test", "version": "1.0.0"}}, "id": 1}' | docker run --rm -i iam-mcp-server:dev
# List available tools
echo '{"jsonrpc": "2.0", "method": "tools/list", "params": {}, "id": 2}' | docker run --rm -i iam-mcp-server:dev
# List available prompts
echo '{"jsonrpc": "2.0", "method": "prompts/list", "params": {}, "id": 3}' | docker run --rm -i iam-mcp-server:dev
```
Key runtime environment variables:
- `RAPIDAPI_KEY` / `RAPIDAPI_HOST` β credentials for the JSearch integration.
- `IAM_DATA_ROOT` (defaults to `/data`) β location where resume meshes and exports are written.
- `LOG_LEVEL` β structured JSON logs emitted via stdout.
- `MCP_TRANSPORT` β keep `stdio` for sidecar usage or swap for another supported transport when needed.
Attach the container to your MCP host by pointing the host's configuration at the container entry point. Share the `/data` volume with the host if it needs direct access to generated artifacts.
Look for `iam_mcp_server-[version].dxt` in the release assets.
#### Installation in Claude Desktop
1. **Download** the latest `.dxt` file from releases
2. **Open Claude Desktop** β Settings β Extensions
3. **Install** the downloaded `.dxt` file
4. **Configure** during installation with these settings:
- `jsearch_api_key`: Your RapidAPI key from [JSearch](https://rapidapi.com/letscrape-6bRBa3QguO5/api/jsearch) (optional - 200 free requests/month)
- `path_to_uvx`: Path to your uvx executable (usually `~/.local/bin` on macOS/Linux, `%USERPROFILE%\.local\bin` on Windows)
#### Build DXT Locally
Want to build your own DXT file?
```bash
make dxt
```
The built DXT file will be available in the `dxt/` directory as `iam_mcp_server-[version].dxt`.
### π Python Package from PyPI
You can also install this project as a Python package from PyPI: [iam-mcp-server](https://pypi.org/project/iam-mcp-server/).
### π₯οΈ Alternative: Manual MCP Configuration
For manual installation or other MCP hosts:
1. Locate your `claude_desktop_config.json` file:
- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
#### Option 1: Using `uvx` with PyPI package
```json
{
"mcpServers": {
"iam": {
"command": "uvx",
"args": [
"--from",
"iam-mcp-server@latest",
"mcp-server-iam"
],
"env": {
"LOG_LEVEL": "INFO",
"RAPIDAPI_KEY": "<API KEY>",
"RAPIDAPI_HOST": "jsearch.p.rapidapi.com",
"MCP_TRANSPORT": "stdio"
}
}
}
```
#### Option 2: Using source code
```json
{
"mcpServers": {
"iam": {
"command": "<path to>/uv",
"args": [
"--directory",
"<path to>/iam-mcp-server/src/mcp_server_iam",
"run",
"__main__.py"
],
"env": {
"LOG_LEVEL": "INFO",
"RAPIDAPI_KEY": "<API KEY>",
"RAPIDAPI_HOST": "jsearch.p.rapidapi.com",
"MCP_TRANSPORT": "stdio"
}
}
}
}
```
#### Restart your MCP host
- Completely quit and restart your MCP host
- The server will automatically initialize when the host starts
#### Verify the connection
In your MCP host, ask: "What MCP tools are available?" or "List the available MCP servers"
### π MCP Inspector
In terminal, run `PYTHONPATH=src mcp dev src/mcp_server_iam/__main__.py` and accept installing the MCP Inspector.
In the web inspector UI, click `connect` and interact with the MCP server.
β οΈ **Important**, this is for `dev` purposes only.
## βοΈ Environment Variables
IAM supports configuration through environment variables. Create a `.env` file in the project root or set these variables in your system:
| Variable | Default | Description |
|----------|---------|-------------|
| `APP_NAME` | `iam` | Application name for logging and identification |
| `LOG_LEVEL` | `INFO` | Logging level: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` |
| `MCP_TRANSPORT` | `stdio` | Application transport version |
| `RESUME_MESH_FILENAME` | `resume_mesh` | Default filename for resume mesh |
| `RAPIDAPI_KEY` | `""` | RapidAPI key for external API access (optional) |
| `RAPIDAPI_HOST` | `jsearch.p.rapidapi.com` | RapidAPI host endpoint |
## π Repository Structure
```text
iam-mcp-server/
βββ ops/ # Production deployment configuration
β βββ k8s/ # Kubernetes manifests and scripts
β β βββ deploy-local.sh # Local Docker Desktop deployment script
β β βββ teardown-local.sh # Local deployment teardown script
β β βββ deployment.yaml # Kubernetes deployment manifest
β β βββ deployment-local.yaml # Local deployment manifest
β β βββ namespace.yaml # Namespace configuration
β β βββ service.yaml # Service configuration
β β βββ ingress.yaml # Ingress configuration
β βββ README.md # Deployment documentation
βββ src/ # Source code
β βββ mcp_server_iam/ # Main MCP server package
β βββ __init__.py # Package initialization
β βββ __main__.py # Entry point for running the server
β βββ config.py # Configuration management
β βββ logging.py # Logging configuration
β βββ prompt.py # LLM prompts and instructions
β βββ server.py # MCP server implementation
β βββ server_http.py # HTTP/SSE transport wrapper
β βββ tool.py # MCP tools implementation
β βββ utils.py # Utility functions
βββ tests/ # Test suite
β βββ __init__.py
β βββ test_config.py # Configuration tests
β βββ test_logging.py # Logging tests
β βββ test_manifest.py # Manifest tests
β βββ test_mcp_tools.py # MCP tools tests
β βββ test_utils.py # Utility tests
βββ .dockerignore # Docker ignore file
βββ .env_example # Environment variables template
βββ AGENTS.md # Agent documentation
βββ CLAUDE.md # Claude Code instructions
βββ Dockerfile # Docker container definition
βββ LICENSE # MIT License
βββ makefile # Build and development tasks
βββ manifest.json # Package manifest
βββ pyproject.toml # Project configuration and dependencies
βββ pytest.ini # Pytest configuration
βββ README.md # This file
βββ requirements.txt # Python dependencies
βββ requirements-dev.txt # Development dependencies
βββ ruff.toml # Ruff linter configuration
βββ uv.lock # UV dependency lock file
```
### π Key Components
- **`ops/`**: Production deployment and operations
- `k8s/`: Kubernetes deployment manifests and automation scripts
- HTTP/SSE server configuration for production environments
- Local Docker Desktop Kubernetes deployment support
- **`src/mcp_server_iam/`**: Core MCP server implementation
- `server.py`: Main MCP server class and protocol handling
- `server_http.py`: HTTP/SSE transport implementation
- `tool.py`: Implementation of MCP tools (job search, etc.)
- `prompt.py`: LLM prompts for resume generation and job analysis
- `config.py`: Configuration management and environment variables
- `logging.py`: Structured logging configuration
- `utils.py`: Helper functions and utilities
- **`tests/`**: Comprehensive test suite for MCP tools and functionality
- **Docker support**: Containerized deployment with both stdio and HTTP/SSE transports
- **Configuration files**: Project setup, linting, and dependency management
## π License
MIT License - see LICENSE file for details
Raw data
{
"_id": null,
"home_page": null,
"name": "iam-mcp-server",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": "Alejandro Garcia <github_dev.chowder574@passmail.net>",
"keywords": "automation, git, jobs, mcp, resume, server",
"author": "Alejandro Garcia",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/02/4c/f4e0e2e11e72d70435a13ec0fbdfcc5fb6b1b9d069a873fbfdcbf0e0218d/iam_mcp_server-2.4.3.tar.gz",
"platform": null,
"description": "# IAM MCP SERVER ... kind of \ud83e\udd14\n\n[![PyPI][pypi-badge]][pypi-url]\n[![MIT licensed][mit-badge]][mit-url]\n[![Python Version][python-badge]][python-url]\n\n**The Individual Applicant Mesh (IAM) MCP Server is designed to process and manage applicant resumes, as well as facilitate job searches. It offers specialized tools and prompts for job searching, resume aggregation, generating job-specific resumes, and creating tailored cover letters.**\n\n[pypi-badge]: https://img.shields.io/pypi/v/mcp.svg\n[pypi-url]: https://pypi.org/project/iam-mcp-server/\n[mit-badge]: https://img.shields.io/pypi/l/mcp.svg\n[mit-url]: https://github.com/alejandrogarcia-hub/iam-mcp-server/blob/main/LICENSE\n[python-badge]: https://img.shields.io/pypi/pyversions/mcp.svg\n[python-url]: https://www.python.org/downloads/\n\n**Note: This server does not fully handle system integrations. Instead, it provides focused functionality specifically for an MCP host\u2014hence the \"kind of \ud83e\udd14\".**\n\n> \ud83d\udca1 **Community & Support** \n> If you found this project helpful, please consider giving it a star \u2b50\ufe0f. Found a bug or have suggestions? Open an issue\u2014your feedback is welcome!\n\n## \ud83d\ude80 Quickstart\n\n### 1. Use Claude Desktop as MCP host\n\nThe IAM MCP Server is designed to work with Claude Desktop, which provides the necessary MCP host environment. For more details on setting up Claude Desktop with MCP, see the [official MCP quickstart guide](https://modelcontextprotocol.io/quickstart/user).\n\n### 2. Add filesystem MCP server\n\nAdd the `filesystem` MCP server to Claude Desktop to enable file system access (see Requirements section below for configuration example).\n\n### 3. Get JSearch API token\n\nCreate a free account at [JSearch](https://rapidapi.com/letscrape-6bRBa3QguO5/api/jsearch) to get your API token (200 free requests/month).\n\n\u26a0\ufe0f **Note:** This step is optional. You can let the MCP host or another MCP server handle job searches instead.\n\n### 4. Configure IAM MCP Server\n\nAdd the following to your Claude Desktop configuration to run the server directly from PyPI using `uvx`:\n\n```json\n{\n \"mcpServers\": {\n \"iam\": {\n \"command\": \"uvx\",\n \"args\": [\n \"--from\", \n \"iam-mcp-server@latest\",\n \"mcp-server-iam\"\n ],\n \"env\": {\n \"LOG_LEVEL\": \"INFO\",\n \"RAPIDAPI_KEY\": \"<YOUR_API_KEY>\",\n \"RAPIDAPI_HOST\": \"jsearch.p.rapidapi.com\",\n \"MCP_TRANSPORT\": \"stdio\"\n }\n }\n }\n}\n```\n\n------------\n> **\ud83d\ude80 Ready to start using IAM MCP Server?** \n> Check out the [Features](#-features) section to learn how to use the available tools and prompts.\n\n## \ud83d\udcdd Requirements\n\n1. \ud83d\uddc2\ufe0f The MCP host must have read and write access to the local file system where it is running. For example, you can run the `IAM MCP Server` within `Claude Desktop`, alongside the `filesystem` MCP Server, which provides this capability. This file access requirement applies to version `1.0` and is necessary for proper operation.\n\n 1.1. Add the `filesystem` MCP server\n\n ```json\n {\n \"mcpServers\": {\n \"filesystem\": {\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-filesystem\",\n \"<add directory for filesystem server>\"\n ]\n }\n }\n }\n ```\n\n2. \ud83d\udd0d The `search job` MCP tool requires access to [JSearch](https://rapidapi.com/letscrape-6bRBa3QguO5/api/JSearch). You can create an account and get 200 requests per month for free.\n\n## \u2728 Features\n\n### Prompts\n\n#### \ud83d\udcca Analyze Job Market\n\nDirects the LLM step-by-step to perform tasks such as conducting a `job search`, then summarizes and analyzes the resulting job listings. Refer to the full prompt for detailed instructions and context.\n\n#### \ud83d\udcc4 Resume Mesh\n\nEasily combine multiple targeted resumes into a single, comprehensive Markdown document.\n\n**What is Resume Mesh?** \nIf you\u2019ve applied to similar jobs, you\u2019ve likely created several versions of your resume to match different job descriptions. Resume Mesh brings all those versions together into one unified Markdown file. This gives the MCP host a complete view of your experience and makes it easy to generate new, tailored resumes for future applications.\n\n#### \ud83c\udfaf Job-Specific Resume Generation\n\nGenerate customized resumes for individual job postings.\n\nTo use this feature, make sure the MCP host already has access to the `resume mesh`. Each tailored resume is generated using both the resume mesh and the specific job description. You need to attach the `resume mesh` to the MCP host conversation in advance, because the resume generation prompt does not instruct the LLM to load the `resume mesh` from the file system.\n\n#### Cover-Letter Generation\n\nEasily generate a customized cover letter tailored to a specific job description, using the corresponding generated resume.\n\n**How to use:** \nBefore generating a cover letter, ensure the MCP host has access to the relevant generated `resume` for the target job. You must manually attach this `resume` to the MCP host conversation, as the cover letter prompt does not automatically retrieve it from the file system.\n\n#### \ud83d\udcbe Save Job\n\nDirects the LLM step-by-step to `save jobs`.\n\n**How to use:**\n\nStart by searching for jobs using the `search jobs` MCP tool. After obtaining the results, you can then instruct the LLM to save those job listings.\n\n### Tools\n\n#### \ud83d\ude80 Search Jobs\n\nPerforms a job search using the following parameters:\n\n- role: The job title or position to search for\n- city: (optional) Target city for the job search\n- country: (optional) Target country for the job search\n- platform: (optional) Specific job platform to use\n- number of jobs: (default 5) Number of job listings to retrieve\n- slice job description: (optional) Option to include only a portion of the job description\n\n## \ud83d\udee0\ufe0f Installation & Setup\n\nThe IAM MCP Server can be installed in multiple ways:\n\n### \ud83d\udce6 Desktop Extension (DXT) - Recommended\n\n**One-click installation for MCP hosts!** DXT (Desktop Extension) format provides the easiest way to install and use the IAM MCP Server.\n\n#### Why DXT?\n\nDesktop Extensions eliminate the complexity of manual MCP server setup by bundling everything into a single installable package:\n\n- **No Python installation required** - All dependencies included\n- **One-click installation** - Just like browser extensions\n- **Automatic updates** - MCP hosts can manage updates\n- **Cross-platform** - Works on macOS, Windows, and Linux\n- **Self-contained** - No environment conflicts\n\n#### Download Latest DXT\n\nGet the latest pre-built DXT file from our GitHub releases:\n\n**[\ud83d\udce5 Download Latest DXT \u2192](https://github.com/alejandrogarcia-hub/iam-mcp-server/releases/latest)**\n\n### \ud83d\udc33 Container Sidecar\n\nBuild a self-contained image and run it alongside your MCP host:\n\n```bash\n# Build image using published wheel (set APP_VERSION to released tag)\ndocker build --no-cache --build-arg APP_VERSION=2.1.0 -t iam-mcp-server:2.1.0 .\n\n# For local source builds, omit APP_VERSION or pass APP_VERSION=local\ndocker build -t iam-mcp-server:dev .\n\n# Start the server with a writable data volume and required secrets\ndocker run --rm \\\n --name iam-mcp-server \\\n -e RAPIDAPI_KEY=your_rapidapi_key \\\n -e LOG_LEVEL=INFO \\\n -e MCP_TRANSPORT=stdio \\\n -v $(pwd)/data:/data \\\n iam-mcp-server:2.1.0\n\n# OR\ndocker run --rm -i \\\n -e RAPIDAPI_KEY=\"your-api-key-here\" \\\n -e LOG_LEVEL=DEBUG \\\n -v $(pwd)/data:/data \\\n iam-mcp-server:dev\n\n# Interactive stdio communication with Docker\n\nWhen running the container interactively, you can send JSON-RPC messages directly:\n\n```bash\n# Start the container in interactive mode\ndocker run -i --rm ghcr.io/alejandrogarcia-hub/iam-mcp-server:latest\n\n# 1. Initialize the server (send this JSON and press Enter)\n{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"0.1.0\",\"capabilities\":{},\"clientInfo\":{\"name\":\"client\",\"version\":\"1.0.0\"}},\"id\":1}\n\n# 2. Send initialized notification\n{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\",\"params\":{\"capabilities\":{}}}\n\n# 3. List available prompts\n{\"jsonrpc\":\"2.0\",\"method\":\"prompts/list\",\"params\":{},\"id\":2}\n\n# 4. List available tools\n{\"jsonrpc\":\"2.0\",\"method\":\"tools/list\",\"params\":{},\"id\":3}\n\n# 5. Graceful shutdown (optional - see note below)\n{\"jsonrpc\":\"2.0\",\"id\":4,\"method\":\"shutdown\"}\n# Server responds with: {\"jsonrpc\":\"2.0\",\"id\":4,\"result\":null}\n\n# 6. Exit notification\n{\"jsonrpc\":\"2.0\",\"method\":\"exit\"}\n```\n\n**Note on Shutdown:** While MCP supports graceful shutdown via `shutdown` request followed by `exit` notification, in practice:\n\n- **Ctrl+C** immediately terminates the container (SIGINT) - fast but not graceful\n- **Ctrl+D** sends EOF to close stdin - cleaner than Ctrl+C\n- **Graceful shutdown sequence** allows the server to properly clean up resources, save state, and acknowledge before terminating\n\nThe graceful shutdown is particularly important in production environments where the server might be handling ongoing operations or needs to persist state before terminating.\n\n```\n\n#### Production Deployment with Kubernetes\n\nFor production environments, deploy the MCP server to Kubernetes and connect via HTTP/SSE:\n\n##### Step 1: Deploy to Kubernetes\n\n```bash\n# Deploy to local Docker Desktop Kubernetes\n./ops/k8s/deploy-local.sh\n\n# Or deploy to production cluster\nkubectl apply -k ops/k8s/\n```\n\nAfter deployment, the server will be accessible at:\n\n- **Local**: `http://localhost:9999` (with port-forward)\n- **Production**: Your configured ingress URL\n\n##### Step 2: Configure Claude Desktop for Kubernetes Connection\n\nClaude Desktop supports HTTP/SSE MCP servers through **Settings > Connectors** (Pro, Max, Team, and Enterprise plans):\n\n**For Local Kubernetes Deployment:**\n\n1. Ensure the server is deployed and port-forward is active:\n\n ```bash\n ./ops/k8s/deploy-local.sh\n # This will set up port-forward on localhost:9999\n ```\n\n2. Open Claude Desktop and navigate to **Settings > Connectors**\n\n3. Click **\"Add custom connector\"** at the bottom\n\n4. Enter the MCP server URL:\n - For local Kubernetes: `http://localhost:9999`\n - For production Kubernetes: `https://your-mcp-server.domain.com`\n\n5. (Optional) Configure authentication in **\"Advanced settings\"**\n\n6. Click **\"Add\"** to save\n\n**Important Notes:**\n\n- HTTP/SSE connectors are configured via Settings > Connectors, NOT in `claude_desktop_config.json`\n- This feature is currently in beta\n- For local Kubernetes, ensure `kubectl port-forward` is running (the deploy script handles this)\n- The server uses SSE for streaming responses back to Claude Desktop\n\n##### Step 3: Test HTTP/SSE Connection\n\nThe HTTP/SSE transport works differently than stdio. Here's how to test it:\n\n**Step 1:** First, establish SSE connection to get session ID:\n\n```bash\n# Connect to SSE endpoint and get the session ID\ncurl -N -H \"Accept: text/event-stream\" \"http://localhost:9999/sse\"\n# Response will include: data: /messages/?session_id=YOUR_SESSION_ID\n```\n\n**Step 2:** Initialize the MCP session (two-step process):\n\n```bash\n# Step 1: Send initialize request\ncurl -X POST \"http://localhost:9999/messages/?session_id=YOUR_SESSION_ID\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"0.1.0\",\"capabilities\":{\"prompts\":{},\"tools\":{}},\"clientInfo\":{\"name\":\"test-client\",\"version\":\"1.0.0\"}},\"id\":1}'\n# Response: \"Accepted\" (actual response comes via SSE)\n\n# Step 2: Send initialized notification\ncurl -X POST \"http://localhost:9999/messages/?session_id=YOUR_SESSION_ID\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\",\"params\":{\"capabilities\":{}}}'\n# Response: \"Accepted\"\n```\n\n**Step 3:** List available prompts and tools:\n\n```bash\n# List prompts\ncurl -X POST \"http://localhost:9999/messages/?session_id=YOUR_SESSION_ID\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"jsonrpc\":\"2.0\",\"method\":\"prompts/list\",\"params\":{},\"id\":2}'\n# Response: \"Accepted\" (actual list comes via SSE)\n\n# List tools\ncurl -X POST \"http://localhost:9999/messages/?session_id=YOUR_SESSION_ID\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"jsonrpc\":\"2.0\",\"method\":\"tools/list\",\"params\":{},\"id\":3}'\n# Response: \"Accepted\" (actual list comes via SSE)\n```\n\n**Note:** All HTTP POST requests return \"Accepted\" immediately. The actual MCP responses are streamed through the SSE connection.\n\n#### Local Development with Docker\n\nFor local development without Kubernetes, use Docker with stdio transport:\n\n```json\n{\n \"mcpServers\": {\n \"iam-docker\": {\n \"command\": \"docker\",\n \"args\": [\n \"run\", \"--rm\", \"-i\",\n \"--name\", \"iam-mcp-claude\",\n \"-e\", \"RAPIDAPI_KEY=your_api_key\",\n \"-e\", \"LOG_LEVEL=INFO\",\n \"-e\", \"MCP_TRANSPORT=stdio\",\n \"-v\", \"/path/to/data:/data\",\n \"iam-mcp-server:latest\"\n ]\n }\n }\n}\n```\n\n**Important notes:**\n\n- Container must run in interactive mode (`-i`) for stdio transport\n- Use `--rm` to clean up containers after disconnection\n- Mount a volume (`-v`) to persist data between sessions\n- Replace `/path/to/data` with your actual data directory\n\n#### Test the container\n\n```bash\necho '{\"jsonrpc\": \"2.0\", \"method\": \"initialize\", \"params\": {\"protocolVersion\": \"0.1.0\", \"capabilities\": {}, \n \"clientInfo\": {\"name\": \"test\", \"version\": \"1.0.0\"}}, \"id\": 1}' | docker run --rm -i iam-mcp-server:dev\n\n# List available tools\necho '{\"jsonrpc\": \"2.0\", \"method\": \"tools/list\", \"params\": {}, \"id\": 2}' | docker run --rm -i iam-mcp-server:dev\n\n# List available prompts\necho '{\"jsonrpc\": \"2.0\", \"method\": \"prompts/list\", \"params\": {}, \"id\": 3}' | docker run --rm -i iam-mcp-server:dev\n```\n\nKey runtime environment variables:\n\n- `RAPIDAPI_KEY` / `RAPIDAPI_HOST` \u2013 credentials for the JSearch integration.\n- `IAM_DATA_ROOT` (defaults to `/data`) \u2013 location where resume meshes and exports are written.\n- `LOG_LEVEL` \u2013 structured JSON logs emitted via stdout.\n- `MCP_TRANSPORT` \u2013 keep `stdio` for sidecar usage or swap for another supported transport when needed.\n\nAttach the container to your MCP host by pointing the host's configuration at the container entry point. Share the `/data` volume with the host if it needs direct access to generated artifacts.\n\nLook for `iam_mcp_server-[version].dxt` in the release assets.\n\n#### Installation in Claude Desktop\n\n1. **Download** the latest `.dxt` file from releases\n2. **Open Claude Desktop** \u2192 Settings \u2192 Extensions\n3. **Install** the downloaded `.dxt` file\n4. **Configure** during installation with these settings:\n - `jsearch_api_key`: Your RapidAPI key from [JSearch](https://rapidapi.com/letscrape-6bRBa3QguO5/api/jsearch) (optional - 200 free requests/month)\n - `path_to_uvx`: Path to your uvx executable (usually `~/.local/bin` on macOS/Linux, `%USERPROFILE%\\.local\\bin` on Windows)\n\n#### Build DXT Locally\n\nWant to build your own DXT file?\n\n```bash\nmake dxt\n```\n\nThe built DXT file will be available in the `dxt/` directory as `iam_mcp_server-[version].dxt`.\n\n### \ud83d\udc0d Python Package from PyPI\n\nYou can also install this project as a Python package from PyPI: [iam-mcp-server](https://pypi.org/project/iam-mcp-server/).\n\n### \ud83d\udda5\ufe0f Alternative: Manual MCP Configuration\n\nFor manual installation or other MCP hosts:\n\n1. Locate your `claude_desktop_config.json` file:\n - **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`\n - **Windows:** `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n#### Option 1: Using `uvx` with PyPI package\n\n```json\n{\n \"mcpServers\": {\n \"iam\": {\n \"command\": \"uvx\",\n \"args\": [\n \"--from\", \n \"iam-mcp-server@latest\",\n \"mcp-server-iam\"\n ],\n \"env\": {\n \"LOG_LEVEL\": \"INFO\",\n \"RAPIDAPI_KEY\": \"<API KEY>\",\n \"RAPIDAPI_HOST\": \"jsearch.p.rapidapi.com\",\n \"MCP_TRANSPORT\": \"stdio\"\n }\n }\n}\n```\n\n#### Option 2: Using source code\n\n```json\n{\n \"mcpServers\": {\n \"iam\": {\n \"command\": \"<path to>/uv\",\n \"args\": [\n \"--directory\",\n \"<path to>/iam-mcp-server/src/mcp_server_iam\",\n \"run\",\n \"__main__.py\"\n ],\n \"env\": {\n \"LOG_LEVEL\": \"INFO\",\n \"RAPIDAPI_KEY\": \"<API KEY>\",\n \"RAPIDAPI_HOST\": \"jsearch.p.rapidapi.com\",\n \"MCP_TRANSPORT\": \"stdio\"\n }\n }\n }\n}\n```\n\n#### Restart your MCP host\n\n- Completely quit and restart your MCP host\n- The server will automatically initialize when the host starts\n\n#### Verify the connection\n\nIn your MCP host, ask: \"What MCP tools are available?\" or \"List the available MCP servers\"\n\n### \ud83d\udd0d MCP Inspector\n\nIn terminal, run `PYTHONPATH=src mcp dev src/mcp_server_iam/__main__.py` and accept installing the MCP Inspector.\nIn the web inspector UI, click `connect` and interact with the MCP server.\n\n\u26a0\ufe0f **Important**, this is for `dev` purposes only.\n\n## \u2699\ufe0f Environment Variables\n\nIAM supports configuration through environment variables. Create a `.env` file in the project root or set these variables in your system:\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `APP_NAME` | `iam` | Application name for logging and identification |\n| `LOG_LEVEL` | `INFO` | Logging level: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` |\n| `MCP_TRANSPORT` | `stdio` | Application transport version |\n| `RESUME_MESH_FILENAME` | `resume_mesh` | Default filename for resume mesh |\n| `RAPIDAPI_KEY` | `\"\"` | RapidAPI key for external API access (optional) |\n| `RAPIDAPI_HOST` | `jsearch.p.rapidapi.com` | RapidAPI host endpoint |\n\n## \ud83d\udcc2 Repository Structure\n\n```text\niam-mcp-server/\n\u251c\u2500\u2500 ops/ # Production deployment configuration\n\u2502 \u251c\u2500\u2500 k8s/ # Kubernetes manifests and scripts\n\u2502 \u2502 \u251c\u2500\u2500 deploy-local.sh # Local Docker Desktop deployment script\n\u2502 \u2502 \u251c\u2500\u2500 teardown-local.sh # Local deployment teardown script\n\u2502 \u2502 \u251c\u2500\u2500 deployment.yaml # Kubernetes deployment manifest\n\u2502 \u2502 \u251c\u2500\u2500 deployment-local.yaml # Local deployment manifest\n\u2502 \u2502 \u251c\u2500\u2500 namespace.yaml # Namespace configuration\n\u2502 \u2502 \u251c\u2500\u2500 service.yaml # Service configuration\n\u2502 \u2502 \u2514\u2500\u2500 ingress.yaml # Ingress configuration\n\u2502 \u2514\u2500\u2500 README.md # Deployment documentation\n\u251c\u2500\u2500 src/ # Source code\n\u2502 \u2514\u2500\u2500 mcp_server_iam/ # Main MCP server package\n\u2502 \u251c\u2500\u2500 __init__.py # Package initialization\n\u2502 \u251c\u2500\u2500 __main__.py # Entry point for running the server\n\u2502 \u251c\u2500\u2500 config.py # Configuration management\n\u2502 \u251c\u2500\u2500 logging.py # Logging configuration\n\u2502 \u251c\u2500\u2500 prompt.py # LLM prompts and instructions\n\u2502 \u251c\u2500\u2500 server.py # MCP server implementation\n\u2502 \u251c\u2500\u2500 server_http.py # HTTP/SSE transport wrapper\n\u2502 \u251c\u2500\u2500 tool.py # MCP tools implementation\n\u2502 \u2514\u2500\u2500 utils.py # Utility functions\n\u251c\u2500\u2500 tests/ # Test suite\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 test_config.py # Configuration tests\n\u2502 \u251c\u2500\u2500 test_logging.py # Logging tests\n\u2502 \u251c\u2500\u2500 test_manifest.py # Manifest tests\n\u2502 \u251c\u2500\u2500 test_mcp_tools.py # MCP tools tests\n\u2502 \u2514\u2500\u2500 test_utils.py # Utility tests\n\u251c\u2500\u2500 .dockerignore # Docker ignore file\n\u251c\u2500\u2500 .env_example # Environment variables template\n\u251c\u2500\u2500 AGENTS.md # Agent documentation\n\u251c\u2500\u2500 CLAUDE.md # Claude Code instructions\n\u251c\u2500\u2500 Dockerfile # Docker container definition\n\u251c\u2500\u2500 LICENSE # MIT License\n\u251c\u2500\u2500 makefile # Build and development tasks\n\u251c\u2500\u2500 manifest.json # Package manifest\n\u251c\u2500\u2500 pyproject.toml # Project configuration and dependencies\n\u251c\u2500\u2500 pytest.ini # Pytest configuration\n\u251c\u2500\u2500 README.md # This file\n\u251c\u2500\u2500 requirements.txt # Python dependencies\n\u251c\u2500\u2500 requirements-dev.txt # Development dependencies\n\u251c\u2500\u2500 ruff.toml # Ruff linter configuration\n\u2514\u2500\u2500 uv.lock # UV dependency lock file\n```\n\n### \ud83d\udd11 Key Components\n\n- **`ops/`**: Production deployment and operations\n - `k8s/`: Kubernetes deployment manifests and automation scripts\n - HTTP/SSE server configuration for production environments\n - Local Docker Desktop Kubernetes deployment support\n\n- **`src/mcp_server_iam/`**: Core MCP server implementation\n - `server.py`: Main MCP server class and protocol handling\n - `server_http.py`: HTTP/SSE transport implementation\n - `tool.py`: Implementation of MCP tools (job search, etc.)\n - `prompt.py`: LLM prompts for resume generation and job analysis\n - `config.py`: Configuration management and environment variables\n - `logging.py`: Structured logging configuration\n - `utils.py`: Helper functions and utilities\n\n- **`tests/`**: Comprehensive test suite for MCP tools and functionality\n\n- **Docker support**: Containerized deployment with both stdio and HTTP/SSE transports\n\n- **Configuration files**: Project setup, linting, and dependency management\n\n## \ud83d\udcdd License\n\nMIT License - see LICENSE file for details\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Individual Application Mesh, MCP Server",
"version": "2.4.3",
"project_urls": {
"Homepage": "https://github.com/alejandrogarcia-hub/iam-mcp-server",
"Issues": "https://github.com/alejandrogarcia-hub/iam-mcp-server/issues",
"Repository": "https://github.com/alejandrogarcia-hub/iam-mcp-server"
},
"split_keywords": [
"automation",
" git",
" jobs",
" mcp",
" resume",
" server"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "ead850526ea9d63a80c1f503ca64153f2e71c7eaa2bdefba0bfe287dddbfed3e",
"md5": "de4334aeb0bc6da9a1ba637bf78ec284",
"sha256": "320f9b0545745ce4fe857467e0c604cce6b0eb31d211c90e57aa4404ee9c9fe3"
},
"downloads": -1,
"filename": "iam_mcp_server-2.4.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "de4334aeb0bc6da9a1ba637bf78ec284",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.11",
"size": 32155,
"upload_time": "2025-10-06T07:37:48",
"upload_time_iso_8601": "2025-10-06T07:37:48.431337Z",
"url": "https://files.pythonhosted.org/packages/ea/d8/50526ea9d63a80c1f503ca64153f2e71c7eaa2bdefba0bfe287dddbfed3e/iam_mcp_server-2.4.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "024cf4e0e2e11e72d70435a13ec0fbdfcc5fb6b1b9d069a873fbfdcbf0e0218d",
"md5": "548d261173fb92a9b96b083b047b0c45",
"sha256": "a9ae721ce6e23c483339c11f47f1b847ee07fcb4deb1e7f140cf2fff117f91b9"
},
"downloads": -1,
"filename": "iam_mcp_server-2.4.3.tar.gz",
"has_sig": false,
"md5_digest": "548d261173fb92a9b96b083b047b0c45",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 890220,
"upload_time": "2025-10-06T07:37:49",
"upload_time_iso_8601": "2025-10-06T07:37:49.569654Z",
"url": "https://files.pythonhosted.org/packages/02/4c/f4e0e2e11e72d70435a13ec0fbdfcc5fb6b1b9d069a873fbfdcbf0e0218d/iam_mcp_server-2.4.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-06 07:37:49",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "alejandrogarcia-hub",
"github_project": "iam-mcp-server",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "annotated-types",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "anyio",
"specs": [
[
"==",
"4.9.0"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"25.3.0"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2025.7.9"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.4.2"
]
]
},
{
"name": "click",
"specs": [
[
"==",
"8.1.8"
]
]
},
{
"name": "h11",
"specs": [
[
"==",
"0.16.0"
]
]
},
{
"name": "httpcore",
"specs": [
[
"==",
"1.0.9"
]
]
},
{
"name": "httpx",
"specs": [
[
"==",
"0.28.1"
]
]
},
{
"name": "httpx-sse",
"specs": [
[
"==",
"0.4.1"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.10"
]
]
},
{
"name": "jsonschema",
"specs": [
[
"==",
"4.24.0"
]
]
},
{
"name": "jsonschema-specifications",
"specs": [
[
"==",
"2025.4.1"
]
]
},
{
"name": "markdown-it-py",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "mcp",
"specs": [
[
"==",
"1.10.1"
]
]
},
{
"name": "mdurl",
"specs": [
[
"==",
"0.1.2"
]
]
},
{
"name": "pydantic",
"specs": [
[
"==",
"2.11.7"
]
]
},
{
"name": "pydantic-core",
"specs": [
[
"==",
"2.33.2"
]
]
},
{
"name": "pydantic-settings",
"specs": [
[
"==",
"2.10.1"
]
]
},
{
"name": "pygments",
"specs": [
[
"==",
"2.19.2"
]
]
},
{
"name": "python-dotenv",
"specs": [
[
"==",
"1.1.1"
]
]
},
{
"name": "python-json-logger",
"specs": [
[
"==",
"3.3.0"
]
]
},
{
"name": "python-multipart",
"specs": [
[
"==",
"0.0.20"
]
]
},
{
"name": "referencing",
"specs": [
[
"==",
"0.36.2"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.4"
]
]
},
{
"name": "rich",
"specs": [
[
"==",
"14.0.0"
]
]
},
{
"name": "rpds-py",
"specs": [
[
"==",
"0.26.0"
]
]
},
{
"name": "shellingham",
"specs": [
[
"==",
"1.5.4"
]
]
},
{
"name": "sniffio",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "sse-starlette",
"specs": [
[
"==",
"2.4.1"
]
]
},
{
"name": "starlette",
"specs": [
[
"==",
"0.48.0"
]
]
},
{
"name": "tenacity",
"specs": [
[
"==",
"9.1.2"
]
]
},
{
"name": "typer",
"specs": [
[
"==",
"0.16.0"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
"==",
"4.14.1"
]
]
},
{
"name": "typing-inspection",
"specs": [
[
"==",
"0.4.1"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.5.0"
]
]
},
{
"name": "uvicorn",
"specs": [
[
"==",
"0.35.0"
]
]
}
],
"lcname": "iam-mcp-server"
}