Skip to main content
Glama
oakley7247

google-maps-harness

by oakley7247

google-maps-harness

Trece herramientas de solo lectura de Google Maps Platform para un agente: dónde está un lugar, qué hay a su alrededor, cuánto se tarda en llegar y cuáles son las condiciones cuando llega.

Dos formas de instalarlo, ambas desde este repositorio:

Para

Configuración

Skill

claude.ai y Claude Code

Subir un zip. Necesita una entrada en la lista de dominios permitidos en claude.ai.

Servidor (MCP) Model Context Protocol

Claude Code, Claude Desktop

Un venv y un comando de registro.

Ambos exponen la misma capacidad con los mismos controles. El Skill existe porque claude.ai no puede iniciar un servidor local; el servidor MCP existe porque es la opción más adecuada cuando un proceso local es aceptable.

Nada de esto escribe, por lo que el riesgo que gestiona no es daño — es costo, contexto y confianza en lo que Google devuelve.

Lo que obtiene un agente

Herramienta

Responde

geocode_address

¿Dónde está esta dirección, punto de referencia o plus code?

reverse_geocode

¿Qué hay en esta coordenada?

geocode_place_id

¿Dónde está exactamente este id de lugar?

validate_address

¿Es esta dirección real y entregable?

search_places_by_text

¿Qué lugares coinciden con "ramen cerca de Union Square"?

search_places_nearby

¿Qué hay dentro de este círculo, por categoría?

get_place_details

Horario, calificación, precio, teléfono, sitio web de un lugar.

autocomplete_places

¿Qué quiso decir probablemente el usuario?

compute_route

¿Cuánto se tarda de A a B, con tráfico?

compute_route_matrix

¿Cuál de estos diez está más cerca de cuál de esos diez?

get_time_zone

¿Qué hora es allí, ahora mismo o en una fecha determinada?

get_elevation

¿Qué altura tiene este punto, o este perfil de puntos?

get_air_quality

¿Cómo está el aire allí, y quién debería tener cuidado?

compute_route_matrix es la herramienta diseñada para decidir en lugar de consultar: una llamada clasifica cada candidato frente a cada opción, y una factura.

El Skill expone las mismas trece como subcomandos — geocode, search-nearby, matrix — más un comando check que diagnostica su propia configuración.

Related MCP server: Google Maps MCP Server Enhanced

Paso 1 — Google Cloud (ambas rutas lo necesitan)

Habilitar las APIs

Habilítalas en Maps APIs → Lista de APIs en un proyecto con facturación activada. Maps Platform rechaza cada solicitud sin una cuenta de facturación adjunta, incluso dentro del crédito mensual gratuito.

API

Herramientas que desbloquea

Geocoding API

geocode_address, reverse_geocode, geocode_place_id

Places API (Nueva)

las cuatro herramientas *_places*

Routes API

compute_route, compute_route_matrix

Time Zone API

get_time_zone

Elevation API

get_elevation

Address Validation API

validate_address

Air Quality API

get_air_quality

Presta atención a Places API (Nueva) específicamente — la consola también lista una "Places API" heredada, y habilitar solo esa produce un 403 en las cuatro herramientas de lugares.

Habilita solo lo que quieras que sea accesible. Una herramienta cuya API está desactivada se niega con un mensaje que la nombra, lo cual es una buena manera de ejecutar una superficie más pequeña deliberadamente.

Crear y restringir la clave

En Credenciales de Maps Platform, crea una clave de API y establece ambas restricciones antes de salir de la página:

  • Restricciones de aplicación → Ninguna. Esta clave es utilizada por un proceso del lado del servidor, no por un navegador o un teléfono. Las restricciones de referente HTTP y Android/iOS fallan para ella.

  • Restricciones de API → Restringir clave, marcando exactamente las APIs anteriores. Una clave sin restricciones factura por cada API de Google en el proyecto, por lo que una filtrada es una cuenta abierta en lugar de una limitada.

Establece también un límite de cuota diaria en la página de Cuotas de cada API. Google lo aplica en su propio borde, que es el único lugar donde un límite de gasto se mantiene sin importar lo que se ejecute en el cliente.

Paso 2a — Instalar como Skill

Construir el paquete

python3 skill/build.py                     # dist/google-maps.zip — no credential
python3 skill/build.py --with-key .env     # also dist/google-maps-personal.zip

Dos compilaciones, porque claude.ai no tiene dónde guardar una clave: no hay entorno que configurar ni un home persistente, por lo que un archivo de clave subido dura una conversación. La compilación personal empaqueta la clave dentro del Skill, que se sube una vez y permanece.

Compilación

Contiene

Subir a

google-maps.zip

sin credencial

cualquiera con quien lo compartas

google-maps-personal.zip

tu clave

solo tu propia cuenta

Esa conveniencia es una exposición real — la clave entonces vive en el artefacto del Skill bajo la retención estándar de Anthropic — por lo que las dos se mantienen separadas por mecanismos en lugar de por cuidado: diferentes nombres de archivo, un banner de no compartir en el propio SKILL.md de la compilación personal, *-personal.zip en gitignore dondequiera que se escriba, y tests/test_skill_build.py que afirma que ninguna clave llega a la compilación compartible incluso cuando una está en el árbol de trabajo.

Instalar en claude.ai

  1. Configuración → Capacidades → Skills, sube el zip.

  2. Configuración → Capacidades → Ejecución de código → Lista de dominios permitidos, añade estos seis:

geocode.googleapis.com
places.googleapis.com
routes.googleapis.com
addressvalidation.googleapis.com
airquality.googleapis.com
maps.googleapis.com

El paso 2 no es opcional y es el que atrapa a la gente. El sandbox llega a internet a través de un proxy gestionado que solo permite dominios listados; en la configuración predeterminada (Solo gestores de paquetes) cada llamada a Maps falla idénticamente con un 403 en el túnel CONNECT, sin importar lo buena que sea la clave.

Seis hosts nombrados superan a Todos los dominios. Esa lista de permitidos es lo único que hay entre un sandbox que ejecuta código escrito por el modelo e internet abierto, y ampliarla a todo para arreglar un Skill gasta un control que no se recupera fácilmente. Las listas por dominio son una característica a nivel de organización; si tu plan solo ofrece todo o nada, esa es la compensación que tienes delante.

Si el sandbox enruta a través de un proxy que el script ignoraría de otro modo, añade --use-proxy (o establece GOOGLE_MAPS_USE_PROXY=1). Consulta Por qué existe --use-proxy.

Instalar en Claude Code

cp -R skill/google-maps ~/.claude/skills/

Acceso completo a la red, nada que añadir a la lista de permitidos.

Verificar

Pídele a Claude que ejecute la verificación del Skill, o ejecútala tú mismo:

python3 skill/google-maps/scripts/maps.py check --all
KEY       bundled with the skill (39 characters, fingerprint 28988599)
PROXY     none in the environment; requests go direct
NETWORK   reachable

OK  Geocoding            enabled
OK  Places (New)         enabled
...

Separa los tres fallos que parecen idénticos desde fuera — sin clave, sin ruta y una API desactivada — y no imprime ninguna parte de la clave.

Paso 2b — Instalar como servidor MCP

python3 -m venv .venv
.venv/bin/pip install --require-hashes -r requirements.lock
.venv/bin/pip install -e . --no-deps
cp .env.example .env && chmod 600 .env      # then fill in GOOGLE_MAPS_API_KEY
claude mcp add google-maps -- /absolute/path/to/.venv/bin/google-maps-harness --env-file /absolute/path/to/.env

La clave va en el archivo, no en esa línea de comandos. Un valor pasado con -e termina en ~/.claude.json y en el historial de tu shell, y ninguno es solo del propietario. El servidor nunca lee un .env al que no se le haya señalado, por lo que nada se carga por accidente.

Reinicia el cliente después de cambiar el código — el proceso registrado carga sus módulos al inicio y, de lo contrario, seguirá ejecutando los antiguos.

Configuración

Toda configuración es opcional excepto la clave. El Skill acepta las mismas opciones como banderas de línea de comandos; python3 scripts/maps.py --help las lista.

Variable

Predeterminado

Qué hace

GOOGLE_MAPS_API_KEY

Obligatorio. La clave de Maps Platform.

GOOGLE_MAPS_TIMEOUT_SECONDS

10

Tiempo de espera de conexión y lectura por solicitud.

GOOGLE_MAPS_MAX_REQUESTS_PER_CALL

25

Solicitudes ascendentes que una llamada de herramienta puede hacer.

GOOGLE_MAPS_MAX_SECONDS_PER_CALL

30

Tiempo de reloj que una llamada de herramienta puede gastar ascendente.

GOOGLE_MAPS_REGION_CODE

sin establecer

Región de dos letras que desempata nombres ambiguos.

GOOGLE_MAPS_LANGUAGE_CODE

en

Idioma para nombres de lugares e instrucciones de ruta.

GOOGLE_MAPS_ALLOW_ATMOSPHERE_FIELDS

false

Permite que las consultas de lugares soliciten reseñas y resúmenes editoriales.

GOOGLE_MAPS_USE_PROXY

false

Solo Skill. Enrutar a través del proxy que nombra el entorno.

Controlar lo que esto cuesta

Google factura por solicitud, y Places factura por el campo más caro que solicites. Tres controles se interponen entre un agente y tu factura.

  • El nivel de detalle fija el precio. Cada herramienta de Places acepta detail: essentials (dirección y coordenadas), pro (añade nombres y estado del negocio), enterprise (añade horario, calificaciones, teléfono, sitio web), atmosphere (añade reseñas). El agente nombra un nivel y nunca compone una máscara de campo, por lo que no puede pedir silenciosamente todo.

  • El nivel atmosphere está desactivado por defecto. Es tanto el nivel más caro como el que introduce prosa escrita por desconocidos en el contexto del modelo. Actívalo deliberadamente o no lo hagas.

  • Cada llamada tiene un límite máximo. Veinticinco solicitudes ascendentes y treinta segundos. Cada resultado informa upstream_requests, por lo que lo que gasta una llamada es visible en la respuesta en lugar de solo en la consola de facturación.

compute_route_matrix está limitada a 100 pares origen-destino, muy por debajo de los 625 de Google, porque Google factura la matriz por par.

Postura de seguridad

  • La clave se mantiene en un solo lugar. Solo el transporte la adjunta. Ninguna herramienta, y ningún otro módulo, la maneja jamás. El Skill además se niega a aceptarla como argumento de línea de comandos, porque argv es visible a través de ps y termina en el historial del shell.

  • Nada enviado puede ser redirigido. Las redirecciones se rechazan directamente y la lista de dominios permitidos se verifica antes de abrir cada socket. Tres de estas APIs llevan la clave en la cadena de consulta, por lo que una redirección seguida entregaría una credencial facturable a un extraño.

  • Cada error se depura. La clave se registra antes de construir cualquier cliente, y cada excepción que sale de una herramienta pasa primero por el depurador.

  • Todo lo que Google devuelve está etiquetado como no confiable. Los nombres de lugares, resúmenes editoriales, reseñas e instrucciones de ruta están escritos por propietarios de negocios y por el público. Cada respuesta lleva una advertencia que le dice al modelo que trate ese texto como datos, y cada cadena se limpia de caracteres de control primero.

  • Cada argumento se valida antes de convertirse en una solicitud. Las coordenadas deben ser finitas — un analizador JSON te dará NaN si lo permites. Los ids de lugar se comparan con una clase de caracteres y luego se codifican como porcentaje en la ruta URL. El texto libre tiene un límite de longitud y rechaza caracteres de control.

  • Las respuestas están limitadas dos veces: 4 MiB del socket, 96 KiB en el contexto del modelo.

Por qué existe --use-proxy

Las variables de entorno de proxy se ignoran por defecto. En una máquina ordinaria, ese valor predeterminado protege la clave: una de esas variables enrutaría cada solicitud a través de un host que alguien más eligió.

Un sandbox lo invierte. Donde un proxy de salida gestionado es la única salida, ignorarlo no protege nada — garantiza que ninguna solicitud salga jamás. Por lo tanto, la elección es explícita en lugar de asumida, y permanece desactivada por defecto porque el entorno que la necesita sabe que la necesita.

Dos cosas siguen siendo válidas con él activado: la lista de permitidos de host se ejecuta antes de que se construya cualquier URL, por lo que no se puede engañar al código para que vaya a un nuevo destino, y un túnel CONNECT mantiene el proxy fuera de la solicitud. Un proxy que termina TLS con su propia autoridad de certificación vería la clave — en un sandbox gestionado que es la misma parte que ya ejecuta el código, pero vale la pena saberlo en lugar de asumirlo.

Lo que esto deliberadamente no hace

  • Sin escrituras. Google Maps Platform no tiene una superficie de escritura significativa aquí, y esto no expone ninguna.

  • Sin máscaras de campo proporcionadas por el llamante. Una máscara de campo es un valor de cabecera HTTP; ensamblada a partir de la salida del modelo es una inyección de cabecera esperando el primer salto de línea, y una forma de solicitar los campos más costosos en cada llamada.

  • Sin libro de gastos local. Los límites diarios por API de Google imponen un presupuesto en su borde, que se mantiene independientemente de lo que se ejecute en el cliente. Duplicar eso localmente añadiría estado, un bloqueo y un segundo número que mantener verdadero.

  • Sin imágenes de mapa ni teselas estáticas. Son bytes que un modelo no puede leer, y sus URLs llevan la clave.

Dónde se ejecuta

Plataforma

Skill

Servidor MCP

Claude Code

sí, red completa

Claude Desktop

claude.ai

sí, una vez que los dominios estén en la lista de permitidos

no — no puede iniciar un proceso local

Claude API container

no — sin acceso a red, no configurable

no

Desarrollo

.venv/bin/python -m unittest discover -s . -p "test_*.py"
.venv/bin/ruff check . && .venv/bin/ruff format --check . && .venv/bin/mypy --strict --exclude tests .

Las pruebas se ejecutan sin conexión. Nada en el conjunto abre un socket ni necesita una clave real — el transporte falso registra lo que habría sido una solicitud, que es lo que permite a una prueba afirmar en el cable en lugar de en el recuento de llamadas de un mock.

El Skill está dirigido a Python 3.9 mientras que el servidor está dirigido a 3.11, porque un Skill se envía a sandboxes que este proyecto no elige. CI ejecuta el Skill en 3.9 exactamente por esa razón: un linter reescribió una vez timezone.utc al datetime.UTC solo de 3.11, y el conjunto — que se ejecuta en 3.11 y 3.14 — no pudo verlo.

Licencia

MIT.

Install Server
A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    -
    quality
    C
    maintenance
    Enables location-aware AI agents to search for nearby places, get detailed place information including hours and ratings, and calculate routes with turn-by-turn directions using Google Maps APIs.
    21
  • A
    license
    B
    quality
    D
    maintenance
    Provides 14 comprehensive tools for geocoding, navigation, and visual mapping using Google Maps APIs. It also offers detailed environmental data including weather forecasts, air quality indices, and solar irradiance for location-based analysis and trip planning.
    14
    11
    MIT

View all related MCP servers

Related MCP Connectors

  • Google Maps MCP Pack — geocoding, places, directions, distance matrix, elevation.

  • Live Google Maps business search, review, and photo data for AI agents over MCP.

  • Real-world data for agents: air quality, geocoding, quakes, holidays, web search

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/oakley7247/google-maps-harness'

If you have feedback or need assistance with the MCP directory API, please join our Discord server