Inicio rápido del servidor MCP
El servidor MCP (Model Context Protocol) de Owning permite a cualquier cliente de IA compatible con MCP — Claude Desktop, GPT, Cursor, o cualquier agente personalizado — buscar, navegar, crear y gestionar anuncios en Owning.pro sin escribir código HTTP. Envuelve la API REST en 10 herramientas simples expuestas sobre JSON-RPC 2.0.
¿Qué es el servidor MCP?
El servidor MCP es una capa fina que traduce las peticiones del protocolo MCP en llamadas HTTP a la API REST de Owning. En lugar de construir peticiones HTTP con cabeceras, URLs y cuerpos JSON, un agente de IA simplemente llama a una herramienta como search_listings o create_listing con argumentos estructurados.
Más simple para agentes — las herramientas tienen parámetros tipados y descripciones, por lo que el LLM sabe exactamente qué pasar.
Sin boilerplate HTTP — el servidor gestiona las cabeceras de autenticación, la construcción de URLs y el análisis de respuestas.
Resultados estructurados — los resultados se devuelven como contenido de texto (JSON o Markdown) listo para que el LLM los procese.
Arquitectura
MCP Client (Claude Desktop, GPT, Cursor, custom agent)
| MCP protocol (JSON-RPC 2.0 over HTTP)
v
MCP Server (https://mcp.owning.pro)
| HTTP calls to api.owning.pro
v
Owning API (https://api.owning.pro)Conexión al servidor MCP
URL del servidor
| Endpoint | Método | Propósito |
|---|---|---|
https://mcp.owning.pro/mcp | POST | Petición-respuesta JSON-RPC 2.0 |
https://mcp.owning.pro/mcp/sse | GET | Keepalive SSE (para clientes que esperan SSE) |
https://mcp.owning.pro/health | GET | Health check + lista de herramientas |
Protocolo
El servidor implementa el transporte Streamable HTTP de MCP (spec 2025-03-26). Cada petición POST /mcp es un ciclo completo de petición-respuesta JSON-RPC 2.0. No se necesita conexión persistente.
Autenticación
Pasa tu API key de Owning como un Bearer token en la cabecera Authorization:
Authorization: Bearer own_aBcD123eFgH456iJkL789mNoP012qRsT345uVwX678yZ- Herramientas de lectura (search, get, categories, asset types) — API key opcional. Sin key, las peticiones son anónimas (sujetas a límites públicos: 100 req/min por IP).
- Herramientas de escritura (create, upload, publish, manage) — API key requerida con permiso write.
- contact_seller — API key opcional (endpoint público, limitado por IP).
Paso 1: Inicializar
curl -X POST https://mcp.owning.pro/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {}
}'
# Response:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2024-11-05",
"capabilities": { "tools": {} },
"serverInfo": { "name": "owning-mcp", "version": "0.2.0" }
}
}Paso 2: Listar herramientas disponibles
curl -X POST https://mcp.owning.pro/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}'
# Response: array of 10 tool definitions with name, description, and inputSchemaPaso 3: Llamar a una herramienta
curl -X POST https://mcp.owning.pro/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer own_aBcD123eFgH..." \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "search_listings",
"arguments": {
"query": "bavaria",
"category": "boats",
"limit": 5
}
}
}'
# Response:
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [{ "type": "text", "text": "{ \"results\": [...], \"pagination\": {...} }" }]
}
}Herramientas de lectura (5)
Herramientas de solo lectura para buscar y navegar anuncios. La API key es opcional — sin ella, las peticiones son anónimas.
1. search_listings
Busca anuncios con filtros. Devuelve anuncios coincidentes con título, precio, ubicación, imágenes y atributos clave.
Parámetros
| Parámetro | Tipo | Requerido | Por defecto | Descripción |
|---|---|---|---|---|
query | string | No | — | Full-text search across title, description, tags, and attributes |
category | string | No | — | Category slug (e.g. boats, cars) |
brand | string | No | — | Filter by brand (passed as attr[brand]) |
min_price | number | No | — | Minimum price filter |
max_price | number | No | — | Maximum price filter |
location | string | No | — | Filter by location (country or city) |
limit | integer | No | 20 | Results per page (max 100) |
offset | integer | No | 0 | Pagination offset |
# Example: search for Bavaria boats under 150k
{
"name": "search_listings",
"arguments": {
"query": "bavaria",
"category": "boats",
"max_price": 150000,
"limit": 10
}
}2. get_listing
Obtiene los detalles completos de un anuncio específico por ID o slug. Devuelve toda la información disponible incluyendo descripción, especificaciones, todas las imágenes, precio, ubicación y atributos.
Parámetros
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
id_or_slug | string | Yes | Listing ID (ULID) or slug (e.g. azimut-95-magellano-2024) |
3. get_listing_markdown
Obtiene un anuncio en formato Markdown — optimizado para agentes y consumo de IA. Incluye todos los datos del anuncio (título, precio, descripción, especificaciones, imágenes, atributos) en un documento Markdown estructurado y legible con frontmatter YAML.
Parámetros
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
id_or_slug | string | Yes | Listing ID (ULID) or slug |
# Example response content:
---
title: "Lagoon 400 S2"
price: 295000
currency: "EUR"
condition: "good"
---
## Description
Gebrauchtboot; Baujahr 2016
## Specifications
- **Brand**: lagoon
- **Year**: 2016
- **Length**: 11.97 m4. list_categories
Lista todas las categorías disponibles en Owning.pro con sus conteos de anuncios. Devuelve un árbol jerárquico de categorías (padres y subcategorías) con nombres slug y conteos. Sin parámetros requeridos.
5. get_asset_type
Obtiene la plantilla de atributos para una categoría específica. Muestra qué campos/atributos están disponibles para los anuncios en esa categoría (ej. brand, model, year, length para barcos).
Parámetros
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
category | string | Yes | Category slug / asset type ID (e.g. boats, cars) |
Herramientas de escritura (5)
Herramientas de escritura para crear, publicar y gestionar anuncios. Todas requieren API key con permiso write, excepto contact_seller que es pública.
6. create_listing
Crea un nuevo anuncio en Owning.pro. El anuncio se crea en estado draft — usa publish_listing para hacerlo visible públicamente. Límite: 10 anuncios por día por usuario.
Parámetros
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
title | string | Yes | 5–120 characters |
description | string | Yes | 20–5000 characters |
category_id | string | Yes | Category ID (use list_categories to find available) |
condition | enum | Yes | new, like_new, good, fair, poor, refurbished |
type | enum | No | sale (default) or wanted |
price | object | Yes | { amount, currency?, negotiable? } — currency defaults to EUR |
location | object | Yes | { country, city, postal_code?, lat?, lng?, shipping? } |
images | array | No | Up to 10: [{ url, alt? }]}. Use upload_image first. |
attributes | object | No | Category-specific attributes (use get_asset_type to discover) |
tags | array | No | Up to 10 tags, each 1–50 characters |
{
"name": "create_listing",
"arguments": {
"title": "Apple iPhone 13 128GB Blue",
"description": "Apple iPhone 13 in blue, 128GB. Good condition, battery health 89%.",
"category_id": "electronics",
"condition": "good",
"price": { "amount": 399, "currency": "EUR", "negotiable": true },
"location": { "country": "ES", "city": "Madrid", "shipping": true },
"tags": ["iphone", "apple", "smartphone"]
}
}7. upload_image
Sube una imagen a Owning.pro. Pasa la imagen como datos base64. Si se proporciona listing_id, la imagen se adjunta a ese anuncio (requiere propiedad). Si se omite, una subida independiente devuelve una URL para usar en create_listing. Límite: 50 imágenes por día. Formatos soportados: jpg, png, webp, heic, heif, avif. Tamaño máximo: 10 MB.
Parámetros
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
image_data | string | Yes | Base64-encoded image data (without data: prefix) |
filename | string | Yes | Original filename including extension (e.g. photo.jpg) |
listing_id | string | No | Listing ID or slug. If provided, attaches to that listing. |
8. publish_listing
Publica un anuncio borrador, haciéndolo visible públicamente en Owning.pro. Mueve el anuncio de draft a active. Solo el propietario del anuncio puede publicarlo.
Parámetros
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
id_or_slug | string | Yes | Listing ID or slug of the draft listing to publish |
9. contact_seller
Contacta al vendedor de un anuncio enviando un mensaje. El email del vendedor nunca se expone — la API retransmite el mensaje por email y el vendedor puede responder a tu email. No requiere API key (endpoint público). Límite: 5 contactos por hora por IP.
Parámetros
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
id_or_slug | string | Yes | Listing ID or slug |
name | string | Yes | Your name (shown to the seller, 1–100 chars) |
email | string | Yes | Your email (the seller can reply to this) |
message | string | Yes | Your message (1–2000 characters) |
10. manage_listing
Gestiona un anuncio existente — actualiza sus campos, cambia su estado, o elimínalo. Solo el propietario del anuncio puede realizar estas acciones. Soporta tres acciones:
Parámetros
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
id_or_slug | string | Yes | Listing ID or slug to manage |
action | enum | Yes | update, change_status, or delete |
status | enum | For change_status | active, paused, or sold |
title, description, price, etc. | various | For update | Any listing field to update (see create_listing for the full list) |
# Example: pause a listing
{
"name": "manage_listing",
"arguments": {
"id_or_slug": "apple-iphone-13-128gb-blue",
"action": "change_status",
"status": "paused"
}
}
# Example: update the price
{
"name": "manage_listing",
"arguments": {
"id_or_slug": "apple-iphone-13-128gb-blue",
"action": "update",
"price": { "amount": 350, "currency": "EUR", "negotiable": false }
}
}
# Example: delete a listing
{
"name": "manage_listing",
"arguments": {
"id_or_slug": "apple-iphone-13-128gb-blue",
"action": "delete"
}
}Límites de uso
El servidor MCP reenvía todas las peticiones a la API REST de Owning, por lo que aplican los límites de la API:
| Herramienta | Límite | Ámbito |
|---|---|---|
| Read tools (no API key) | 100 req/min | per IP |
| Read tools (with API key) | 300 req/min | per key |
create_listing | 10 req/day | per user |
upload_image | 50 req/day | per user |
contact_seller | 5 req/hour | per IP |
Gestión de errores
Los errores de herramientas se devuelven como resultados MCP con isError: true y un mensaje de error en el contenido:
{
"jsonrpc": "2.0",
"id": 4,
"result": {
"content": [{ "type": "text", "text": "Search failed: Rate limit exceeded (status 429)" }],
"isError": true
}
}Los argumentos inválidos (fallos de validación de esquema) también se devuelven como resultados isError con una descripción de qué campos fallaron.
Health check
curl https://mcp.owning.pro/health
# Response:
{
"status": "ok",
"service": "owning-mcp",
"version": "0.2.0",
"timestamp": "2026-07-11T16:17:44.333Z",
"apiBaseUrl": "https://api.owning.pro",
"tools": [
"search_listings", "get_listing", "get_listing_markdown",
"list_categories", "get_asset_type",
"create_listing", "upload_image", "publish_listing",
"contact_seller", "manage_listing"
]
}Consulta el ejemplo de integración del servidor MCP para un recorrido completo end-to-end en Python y JavaScript.