phpIPAM MCP Server
Model Context Protocol server for phpIPAM IP address management and network infrastructure.
Installation
Prerequisites
- Python 3.10+
- phpIPAM instance with API access
- App configured in phpIPAM with "SSL with App Code token" security
From PyPI (when published)
pip install phpipam-mcp-server
From Source
git clone https://github.com/InfraMCP/phpipam-mcp-server.git
cd phpipam-mcp-server
pip install -e .
Development Installation
pip install -e ".[dev]"
Usage
The server supports two transports, selected with the MCP_TRANSPORT environment
variable:
| Transport | MCP_TRANSPORT |
Use case |
|---|---|---|
| Local (default) | stdio |
Launched by the MCP client on the same machine |
| Remote | streamable-http |
Runs as an HTTP service behind a TLS reverse proxy |
Local (stdio)
The default transport. The MCP client starts the server as a subprocess, so no
MCP_TRANSPORT value is required. Add to your MCP client configuration:
{
"mcpServers": {
"phpipam": {
"command": "phpipam-mcp-server",
"env": {
"PHPIPAM_URL": "https://ipam.example.com/",
"PHPIPAM_APP_ID": "your_app_id",
"PHPIPAM_APP_CODE": "your_app_code_token"
}
}
}
}
Remote (streaming HTTP)
Set MCP_TRANSPORT=streamable-http to run the server as a long-lived HTTP
service that any streamable-http capable MCP client can reach at a URL such as
https://phpipam.example.com/mcp. This mode is intended to run behind a reverse
proxy that terminates TLS (see DEPLOYMENT.md for a full
Docker + Caddy walkthrough).
Key differences from stdio mode:
- The MCP endpoint is served at
MCP_PATH(default/mcp). - A static bearer token (
MCP_BEARER_TOKEN) protects the endpoint. Clients must sendAuthorization: Bearer <token>. - phpIPAM credentials can be supplied per client via
X-phpIPAM-*HTTP headers, falling back to the server-widePHPIPAM_*environment variables. - An unauthenticated
/healthendpoint is exposed for liveness probes.
Configuration (environment variables):
| Variable | Default | Description |
|---|---|---|
MCP_TRANSPORT |
stdio |
Set to streamable-http for remote mode |
MCP_HOST |
0.0.0.0 |
Bind address (HTTP mode) |
MCP_PORT |
8000 |
Bind port (HTTP mode) |
MCP_PATH |
/mcp |
Path for the MCP endpoint |
MCP_BEARER_TOKEN |
— | Required token for Authorization: Bearer <token> |
PHPIPAM_URL |
— | Server-wide phpIPAM URL (fallback) |
PHPIPAM_APP_ID |
— | Server-wide phpIPAM App ID (fallback) |
PHPIPAM_APP_CODE |
— | Server-wide phpIPAM App Code (fallback) |
PHPIPAM_VERIFY_SSL |
true |
Verify TLS to phpIPAM |
Run it locally:
export MCP_TRANSPORT=streamable-http
export MCP_BEARER_TOKEN="$(openssl rand -hex 32)"
export PHPIPAM_URL="https://ipam.example.com/"
export PHPIPAM_APP_ID="your_app_id"
export PHPIPAM_APP_CODE="your_app_code_token"
phpipam-mcp-server
Generate a strong token with openssl rand -hex 32. Never expose the endpoint
over plain HTTP — always place it behind HTTPS.
MCP client configuration (remote):
{
"mcpServers": {
"phpipam": {
"type": "http",
"url": "https://phpipam.example.com/mcp",
"headers": {
"Authorization": "Bearer <MCP_BEARER_TOKEN>",
"X-phpIPAM-URL": "https://ipam.example.com/",
"X-phpIPAM-App-Id": "your_app_id",
"X-phpIPAM-App-Code": "your_app_code_token"
}
}
}
}
If you configure shared phpIPAM credentials on the server (via PHPIPAM_*),
omit the X-phpIPAM-* headers and send only Authorization.
Quick test:
# Health check (no auth required)
curl https://phpipam.example.com/health
# -> {"status":"ok"}
# Without a token the MCP endpoint returns 401
curl -i https://phpipam.example.com/mcp
Available Tools
list_sections(include_fields="")
List all IP sections from phpIPAM.
include_fields: Comma-separated fields or "all" for complete data
get_section_subnets(section_id, include_usage=True, include_fields="", limit=20)
Get subnets within a specific section.
section_id: Section ID to queryinclude_usage: Include usage statistics (default: True)include_fields: Field filtering optionslimit: Maximum results to return (default: 20, max: 1000)
search_addresses(ip_or_hostname, limit=10)
Search for IP addresses or hostnames.
ip_or_hostname: IP address or hostname to search forlimit: Maximum results to return (default: 10, max: 1000)
search_hostname(hostname, limit=10)
Search for IP addresses by exact or partial hostname. Supports * wildcards.
hostname: Hostname to search for (e.g.,server01orweb-*)limit: Maximum results to return (default: 10, max: 50)
get_subnet_details(subnet_id, include_addresses=False, address_limit=10)
Get detailed subnet information.
subnet_id: Subnet ID to queryinclude_addresses: Include IP addresses in subnet (default: False)address_limit: Maximum addresses to show (default: 10, max: 1000)
list_vlans(domain_id=None, limit=20)
List VLANs from phpIPAM.
domain_id: Optional domain ID filterlimit: Maximum results to return (default: 20, max: 1000)
list_vrfs(limit=20)
List VRF instances from phpIPAM.
limit: Maximum results to return (default: 20, max: 1000)
list_locations(limit=20)
List physical locations for network infrastructure.
limit: Maximum results to return (default: 20, max: 1000)
list_nameservers(limit=20)
List DNS nameservers with configuration details.
limit: Maximum results to return (default: 20, max: 1000)
search_subnets(query, limit=10)
Search subnets by CIDR, description, or other criteria.
query: Search term (CIDR, description, etc.)limit: Maximum results to return (default: 10, max: 1000)
Write Operations
create_subnet(section_id, subnet, mask, *, description="", vlan_id=None)
Create a new subnet in phpIPAM.
section_id: Section ID where subnet will be createdsubnet: Network address (e.g., "192.168.1.0")mask: Subnet mask (e.g., "24")description: Optional description for the subnetvlan_id: Optional VLAN ID
reserve_ip_address(subnet_id, ip=None, hostname="", description="", owner="")
Reserve an IP address in a subnet.
subnet_id: Subnet ID where IP will be reservedip: Specific IP address to reserve (optional - will find first available)hostname: Hostname for the IP addressdescription: Description for the IP addressowner: Owner of the IP address
update_ip_address(address_id, hostname=None, description=None, owner=None)
Update an existing IP address record.
address_id: ID of the IP address to updatehostname: New hostname (optional)description: New description (optional)owner: New owner (optional)
delete_ip_address(address_id)
Delete/release an IP address reservation.
address_id: ID of the IP address to delete
update_subnet(subnet_id, description=None, vlan_id=None, vrf_id=None)
Update an existing subnet.
subnet_id: ID of the subnet to updatedescription: New description (optional)vlan_id: New VLAN ID (optional)vrf_id: New VRF ID (optional)
delete_subnet(subnet_id)
Delete a subnet (WARNING: This will delete all IP addresses in the subnet).
subnet_id: ID of the subnet to delete
Configuration
phpIPAM Setup
- Create an API application in phpIPAM admin interface
- Set security to "SSL with App Code token"
- Note the App ID and App Code
- Set appropriate permissions for the application
Authentication
This server uses static app code token authentication:
- No token expiration
- Simple configuration
- Secure over HTTPS
Development
Code Quality
# Run pylint
python -m pylint src/phpipam_mcp_server/
# Run tests (when available)
python -m pytest
# Format code
python -m black src/
python -m isort src/
Project Structure
src/phpipam_mcp_server/
├── __init__.py # Package initialization
└── server.py # Main MCP server implementation
API Documentation
See the docs/ directory for detailed API documentation:
api-overview.md- General API informationcontrollers.md- Available endpoints and data structuresexamples.md- Request/response examplesmcp-design.md- MCP server design and architecture
License
MIT License - see LICENSE file for details.
Contributing
- Fork the repository
- Create a feature branch
- Make changes with tests
- Run code quality checks
- Submit a pull request
Support
- GitHub Issues: https://github.com/InfraMCP/phpipam-mcp-server/issues
- Documentation: https://github.com/InfraMCP/phpipam-mcp-server#readme
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 phpipam_mcp_server-0.3.0.tar.gz.
File metadata
- Download URL: phpipam_mcp_server-0.3.0.tar.gz
- Upload date:
- Size: 16.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c1178575482b83181917afee8f33092a218366184e2d5b73e59e41367363ae87
|
|
| MD5 |
ec1793b0d848f3fc2114fa3e1a308e53
|
|
| BLAKE2b-256 |
38435afc459481a7a04c031ec0cd839fbfb8bd0f28cc78beb32958b8ba801ec4
|
Provenance
The following attestation bundles were made for phpipam_mcp_server-0.3.0.tar.gz:
Publisher:
publish.yml on InfraMCP/phpipam-mcp-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
phpipam_mcp_server-0.3.0.tar.gz -
Subject digest:
c1178575482b83181917afee8f33092a218366184e2d5b73e59e41367363ae87 - Sigstore transparency entry: 2672830950
- Sigstore integration time:
-
Permalink:
InfraMCP/phpipam-mcp-server@8f66270d8a52775f3ce193e70a7e0b3e0154d979 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/InfraMCP
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8f66270d8a52775f3ce193e70a7e0b3e0154d979 -
Trigger Event:
release
-
Statement type:
File details
Details for the file phpipam_mcp_server-0.3.0-py3-none-any.whl.
File metadata
- Download URL: phpipam_mcp_server-0.3.0-py3-none-any.whl
- Upload date:
- Size: 13.9 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 |
fd8b7f85fa2d8127542aa3863cfd28ae855afb1f45113f79d22db707a45fc1d3
|
|
| MD5 |
165e655e5857668bf4ddc6b4b75d8f92
|
|
| BLAKE2b-256 |
c8ef0e4e8f5292153087bf37477305e3e4a32e0b32621346d66dadcd9f6adebf
|
Provenance
The following attestation bundles were made for phpipam_mcp_server-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on InfraMCP/phpipam-mcp-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
phpipam_mcp_server-0.3.0-py3-none-any.whl -
Subject digest:
fd8b7f85fa2d8127542aa3863cfd28ae855afb1f45113f79d22db707a45fc1d3 - Sigstore transparency entry: 2672831031
- Sigstore integration time:
-
Permalink:
InfraMCP/phpipam-mcp-server@8f66270d8a52775f3ce193e70a7e0b3e0154d979 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/InfraMCP
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8f66270d8a52775f3ce193e70a7e0b3e0154d979 -
Trigger Event:
release
-
Statement type: