visa-jobs-mcp

Identifica oportunidades de patrocinio de visas en EE. UU. en LinkedIn y accede a los contactos adecuados para acelerar tu alcance.

Documentación

visa-jobs-mcp MIT License Homebrew Tap

visa-jobs-mcp es un servidor MCP que ayuda a los agentes a encontrar empleos relevantes a partir de búsquedas recientes de LinkedIn, con filtrado opcional basado en visados.

Screenshot 2026-02-20 at 10 20 22 am

Está diseñado para ser rápido y orientado a resultados prácticos:

  • buscar empleos en una ubicación,
  • comparar empleadores con historial de patrocinio,
  • devolver resultados accionables con enlaces e información de contacto,
  • mantener los datos del usuario de forma local.

Comenzar

1. Instalar en macOS (Homebrew)

brew tap neosh11/visa-jobs-mcp
brew install neosh11/visa-jobs-mcp/visa-jobs-mcp

2. Instalar en macOS/Linux (instalador bash)

curl -fsSL https://raw.githubusercontent.com/neosh11/visa-jobs-mcp/main/scripts/install.sh | bash

Fijar una versión específica:

curl -fsSL https://raw.githubusercontent.com/neosh11/visa-jobs-mcp/main/scripts/install.sh | bash -s -- --version 0.3.1

3. Instalar en Windows (instalador PowerShell)

irm https://raw.githubusercontent.com/neosh11/visa-jobs-mcp/main/scripts/install.ps1 | iex

Fijar una versión específica:

$env:VISA_JOBS_MCP_VERSION = "0.3.1"
irm https://raw.githubusercontent.com/neosh11/visa-jobs-mcp/main/scripts/install.ps1 | iex

4. Registrar en Codex (macOS/Linux)

codex mcp add visa-jobs-mcp --env VISA_JOB_SITES=linkedin -- visa-jobs-mcp

Registrar en Codex (Windows PowerShell):

codex mcp add visa-jobs-mcp --env VISA_JOB_SITES=linkedin -- "$env:LOCALAPPDATA\\Programs\\visa-jobs-mcp\\bin\\visa-jobs-mcp.exe"

Verificar:

codex mcp list
codex mcp get visa-jobs-mcp

5. Usarlo en el chat

En una nueva sesión de Codex, pregunta de forma natural:

  • Find IT jobs in Delhi for my skills.
  • Set my visa preference to E3 and find software engineer jobs in New York that sponsor E3.

Compilar desde el código fuente (opcional)

go build -o visa-jobs-mcp ./cmd/visa-jobs-mcp
./visa-jobs-mcp --version

Si necesitas actualizar data/companies.csv desde el código fuente, ejecuta:

./scripts/run_internal_pipeline.sh

Nota: el runtime de MCP es solo Go. Python solo es necesario para los mantenedores que ejecutan el pipeline interno de datos.

E2E en vivo con LinkedIn (manual)

Ejecuta una búsqueda real de extremo a extremo contra LinkedIn (no pruebas simuladas):

./scripts/run_live_linkedin_e2e.sh

Anulación opcional del tiempo de espera:

VISA_E2E_TEST_TIMEOUT=8m ./scripts/run_live_linkedin_e2e.sh

Parámetros opcionales de prueba en vivo:

VISA_E2E_VISA_TYPE=E3 \
VISA_E2E_LOCATION="New York, NY" \
VISA_E2E_JOB_TITLE="Software Engineer" \
./scripts/run_live_linkedin_e2e.sh

Qué soporta

  • Búsqueda exclusiva en LinkedIn.
  • Búsqueda general de empleos por habilidad/ubicación sin necesidad de configuración de visado.
  • Coincidencia opcional de preferencias de visado cuando preferred_visa_types está configurado.
  • Sesiones de búsqueda con paginación y soporte de reanudación.
  • Empleos guardados y empleos ignorados.
  • Extracción de contacto del empleador cuando esté disponible.
  • Almacenamiento de datos privados y local primero.
  • Sin uso de proxy.
  • Sin llamadas a LLM dentro del runtime de MCP (el agente maneja el razonamiento).

Herramientas MCP principales

  • start_job_search
  • get_job_search_status
  • get_job_search_results
  • set_user_preferences
  • start_visa_job_search
  • get_visa_job_search_status
  • get_visa_job_search_results
  • save_job_for_later
  • ignore_job
  • list_saved_jobs
  • list_ignored_jobs
  • get_mcp_capabilities

Consejo: pide al agente que llame a get_mcp_capabilities primero para obtener un contrato legible por máquina.

Contrato MCP (Generado)

Expandir Contrato MCP (generado automáticamente)

Generado desde get_mcp_capabilities() mediante scripts/generate_contract_docs.py.

Servidor

  • server: visa-jobs-mcp
  • version: 0.3.1
  • capabilities_schema_version: 1.2.0
  • confidence_model_version: v1.1.0-rules-go

Requerido antes de buscar

  • tool: start_job_search
  • required_fields: user_id

Decisiones de diseño

  • agent_is_reasoning_layer: True
  • background_search_runs_local_persistence: True
  • data_not_shared_or_sold: True
  • first_class_job_management: True
  • free_forever: True
  • fresh_job_search_per_query: True
  • ignored_companies_local_persistence: True
  • ignored_jobs_local_persistence: True
  • license: MIT
  • llm_api_keys_required_by_mcp: False
  • llm_runtime_inside_mcp: False
  • no_fake_reviews_or_bot_marketing: True
  • proxies_used: False
  • rate_limit_backoff_retries: True
  • saved_jobs_local_persistence: True
  • search_sessions_local_persistence: True
  • strict_user_visa_match: False
  • strictness_modes_supported: ['balanced', 'strict']
  • supported_job_sites: ['linkedin']
  • visa_matching_optional: True

Valores predeterminados

  • dataset_stale_after_days: 30
  • job_db_path: data/app/visa_jobs.db
  • max_scan_results: 1200
  • max_search_sessions_per_user: 20
  • rate_limit_initial_backoff_seconds: 2
  • rate_limit_max_backoff_seconds: 30
  • rate_limit_retry_window_seconds: 180
  • scan_multiplier: 8
  • search_run_ttl_seconds: 21600
  • search_session_ttl_seconds: 21600
  • strictness_mode: strict
  • tool_call_soft_timeout_seconds: 48

Herramientas

HerramientaDescripciónEntradas requeridasEntradas opcionales
get_mcp_capabilitiesDevuelve capacidades, herramientas y contratos de MCP para el autodescubrimiento del agente.--
set_user_preferencesGuarda las preferencias de visado del usuario para la coincidencia opcional específica de visado.user_id, preferred_visa_types-
set_user_constraintsGuarda restricciones de urgencia y modalidad de trabajo utilizadas para la orientación personalizada.user_id-
get_user_preferencesObtiene las preferencias y restricciones guardadas del usuario.user_id-
get_user_readinessInforma si el usuario y el conjunto de datos local están listos para la búsqueda.user_id-
find_related_titlesDevuelve títulos de roles adyacentes para ampliar búsquedas de bajo rendimiento.job_title-
add_user_memory_lineAgrega una línea de memoria de perfil (habilidades, objetivos, miedos, restricciones).user_id, content-
query_user_memory_blobConsulta el bloque de memoria local del usuario con filtrado de texto opcional.user_id-
delete_user_memory_lineElimina una línea de memoria por id del bloque local.user_id, line_id-
save_job_for_laterGuarda un empleo en la lista corta local del usuario para seguimiento.user_idjob_url, result_id, session_id
list_saved_jobsLista los empleos guardados en orden cronológico inverso.user_id-
delete_saved_jobElimina un empleo guardado de la lista corta local.user_id, saved_job_id-
ignore_jobOculta un empleo de resultados futuros para este usuario.user_idjob_url, result_id, session_id
list_ignored_jobsLista los empleos ignorados en orden cronológico inverso.user_id-
unignore_jobDeja de ocultar un empleo previamente ignorado por id.user_id, ignored_job_id-
ignore_companyOculta todos los empleos de una empresa en búsquedas futuras.user_id-
list_ignored_companiesLista las empresas ignoradas en orden cronológico inverso.user_id-
unignore_companyElimina una empresa de la lista de ignoradas.user_id, ignored_company_id-
mark_job_appliedMarca un empleo como postulado y persiste el estado del pipeline.user_id-
update_job_stageActualiza la etapa del ciclo de vida de un empleo rastreado (guardado/postulado/entrevista/etc).user_id, stage-
list_jobs_by_stageLista los empleos rastreados filtrados por etapa del ciclo de vida.user_id, stage-
add_job_noteAdjunta o agrega una nota a un registro de empleo rastreado.user_id, note-
list_recent_job_eventsLista transiciones de etapa recientes y eventos del ciclo de vida.user_id-
get_job_pipeline_summaryResume los conteos del pipeline rastreado por etapa para un usuario.user_id-
clear_search_sessionElimina una sesión de búsqueda en caché o todas las sesiones de un usuario.user_id-
export_user_dataExporta todos los registros locales de un usuario en todos los almacenes.user_id-
delete_user_dataElimina permanentemente todos los registros locales de un usuario.user_id, confirm-
get_best_contact_strategySugiere el mejor canal/contacto de divulgación para un empleo.user_id-
generate_outreach_messageGenera un borrador de divulgación práctico adaptado al usuario y al rol.user_id-
start_job_searchInicia una búsqueda de empleo en segundo plano sin requerir preferencias de visado.location, job_title, user_id-
get_job_search_statusConsulta el progreso/eventos incrementales de una ejecución de búsqueda de empleo en segundo plano.user_id, run_id-
get_job_search_resultsObtiene la página de resultados actual de una ejecución de búsqueda de empleo en segundo plano.user_id, run_id-
cancel_job_searchSolicita la cancelación de una ejecución de búsqueda de empleo en segundo plano en curso.user_id, run_id-
start_visa_job_searchInicia una ejecución de búsqueda en segundo plano para escaneos largos.location, job_title, user_id-
get_visa_job_search_statusConsulta el progreso/eventos incrementales de una ejecución de búsqueda en segundo plano.user_id, run_id-
get_visa_job_search_resultsObtiene la página de resultados actual de una ejecución de búsqueda en segundo plano.user_id, run_id-
cancel_visa_job_searchSolicita la cancelación de una ejecución en segundo plano en curso.user_id, run_id-
discover_latest_dol_disclosure_urlsDescubre las fuentes más recientes de divulgación DOL LCA/PERM.--
run_internal_dol_pipelineEjecuta el pipeline interno para actualizar el conjunto de datos de empresas patrocinadoras.--
refresh_company_dataset_cacheLimpia y recarga la caché del conjunto de datos de empresas en memoria.--

Campos de respuesta de búsqueda

  • run
  • status
  • stats
  • guidance
  • dataset_freshness
  • pagination
  • recovery_suggestions
  • jobs[].result_id
  • jobs[].job_url
  • jobs[].title
  • jobs[].company
  • jobs[].location
  • jobs[].site
  • jobs[].date_posted
  • jobs[].description_fetched
  • jobs[].description
  • jobs[].description_excerpt
  • jobs[].salary_text
  • jobs[].salary_currency
  • jobs[].salary_interval
  • jobs[].salary_min_amount
  • jobs[].salary_max_amount
  • jobs[].salary_source
  • jobs[].job_type
  • jobs[].job_level
  • jobs[].company_industry
  • jobs[].job_function
  • jobs[].job_url_direct
  • jobs[].is_remote
  • jobs[].employer_contacts
  • jobs[].visa_counts
  • jobs[].visas_sponsored
  • jobs[].visa_match_strength
  • jobs[].eligibility_reasons
  • jobs[].confidence_score
  • jobs[].confidence_model_version
  • jobs[].agent_guidance

Rutas

  • dataset_default: data/companies.csv
  • ignored_companies_default: data/config/ignored_companies.json
  • ignored_jobs_default: data/config/ignored_jobs.json
  • job_management_db_default: data/app/visa_jobs.db
  • pipeline_manifest_default: data/pipeline/last_run.json
  • saved_jobs_default: data/config/saved_jobs.json
  • search_runs_store_default: data/config/search_runs.json
  • search_session_store_default: data/config/search_sessions.json
  • user_memory_blob_default: data/config/user_memory_blob.json
  • user_preferences_default: data/config/user_preferences.json

Deprecaciones

  • build_company_dataset_from_dol_disclosures -> run_internal_dol_pipeline (soft_deprecated)
JSON de capacidades sin procesar
{
  "capabilities_schema_version": "1.2.0",
  "confidence_model_version": "v1.1.0-rules-go",
  "defaults": {
    "dataset_stale_after_days": 30,
    "job_db_path": "data/app/visa_jobs.db",
    "max_scan_results": 1200,
    "max_search_sessions_per_user": 20,
    "rate_limit_initial_backoff_seconds": 2,
    "rate_limit_max_backoff_seconds": 30,
    "rate_limit_retry_window_seconds": 180,
    "scan_multiplier": 8,
    "search_run_ttl_seconds": 21600,
    "search_session_ttl_seconds": 21600,
    "strictness_mode": "strict",
    "tool_call_soft_timeout_seconds": 48
  },
  "deprecations": [
    {
      "name": "build_company_dataset_from_dol_disclosures",
      "replacement": "run_internal_dol_pipeline",
      "status": "soft_deprecated"
    }
  ],
  "design_decisions": {
    "agent_is_reasoning_layer": true,
    "background_search_runs_local_persistence": true,
    "data_not_shared_or_sold": true,
    "first_class_job_management": true,
    "free_forever": true,
    "fresh_job_search_per_query": true,
    "ignored_companies_local_persistence": true,
    "ignored_jobs_local_persistence": true,
    "license": "MIT",
    "llm_api_keys_required_by_mcp": false,
    "llm_runtime_inside_mcp": false,
    "no_fake_reviews_or_bot_marketing": true,
    "proxies_used": false,
    "rate_limit_backoff_retries": true,
    "saved_jobs_local_persistence": true,
    "search_sessions_local_persistence": true,
    "strict_user_visa_match": false,
    "strictness_modes_supported": [
      "balanced",
      "strict"
    ],
    "supported_job_sites": [
      "linkedin"
    ],
    "visa_matching_optional": true
  },
  "pagination_contract": {
    "next_step": "use pagination.next_offset to request the next page",
    "offset_model": "offset is applied to accepted jobs, not raw scraped jobs",
    "result_id_aliases": "use jobs[].result_id in save_job_for_later/ignore_job to avoid URL copy friction",
    "scan_behavior": "server can increase raw scan depth when auto_expand_scan=true",
    "session_behavior": "pass search_session.session_id for stable paging without redundant rescans"
  },
  "paths": {
    "dataset_default": "data/companies.csv",
    "ignored_companies_default": "data/config/ignored_companies.json",
    "ignored_jobs_default": "data/config/ignored_jobs.json",
    "job_management_db_default": "data/app/visa_jobs.db",
    "pipeline_manifest_default": "data/pipeline/last_run.json",
    "saved_jobs_default": "data/config/saved_jobs.json",
    "search_runs_store_default": "data/config/search_runs.json",
    "search_session_store_default": "data/config/search_sessions.json",
    "user_memory_blob_default": "data/config/user_memory_blob.json",
    "user_preferences_default": "data/config/user_preferences.json"
  },
  "rate_limit_contract": {
    "failure_message": "asks agent to retry shortly when the retry window is exhausted",
    "max_retry_window_seconds": 180,
    "retry_behavior": "automatic exponential backoff on rate-limit errors (429/Too Many Requests)"
  },
  "required_before_search": {
    "required_fields": [
      "user_id"
    ],
    "tool": "start_job_search"
  },
  "search_response_fields_for_agents": [
    "run",
    "status",
    "stats",
    "guidance",
    "dataset_freshness",
    "pagination",
    "recovery_suggestions",
    "jobs[].result_id",
    "jobs[].job_url",
    "jobs[].title",
    "jobs[].company",
    "jobs[].location",
    "jobs[].site",
    "jobs[].date_posted",
    "jobs[].description_fetched",
    "jobs[].description",
    "jobs[].description_excerpt",
    "jobs[].salary_text",
    "jobs[].salary_currency",
    "jobs[].salary_interval",
    "jobs[].salary_min_amount",
    "jobs[].salary_max_amount",
    "jobs[].salary_source",
    "jobs[].job_type",
    "jobs[].job_level",
    "jobs[].company_industry",
    "jobs[].job_function",
    "jobs[].job_url_direct",
    "jobs[].is_remote",
    "jobs[].employer_contacts",
    "jobs[].visa_counts",
    "jobs[].visas_sponsored",
    "jobs[].visa_match_strength",
    "jobs[].eligibility_reasons",
    "jobs[].confidence_score",
    "jobs[].confidence_model_version",
    "jobs[].agent_guidance"
  ],
  "server": "visa-jobs-mcp",
  "tools": [
    {
      "description": "Return MCP capabilities, tools, and contracts for agent self-discovery.",
      "name": "get_mcp_capabilities",
      "required_inputs": []
    },
    {
      "description": "Save the user's visa preferences for optional visa-specific matching.",
      "name": "set_user_preferences",
      "required_inputs": [
        "user_id",
        "preferred_visa_types"
      ]
    },
    {
      "description": "Save urgency and work-mode constraints used for personalized guidance.",
      "name": "set_user_constraints",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Fetch the saved user preferences and constraints.",
      "name": "get_user_preferences",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Report whether the user and local dataset are ready for search.",
      "name": "get_user_readiness",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Return adjacent role titles to widen low-yield searches.",
      "name": "find_related_titles",
      "required_inputs": [
        "job_title"
      ]
    },
    {
      "description": "Append a profile memory line (skills, goals, fears, constraints).",
      "name": "add_user_memory_line",
      "required_inputs": [
        "user_id",
        "content"
      ]
    },
    {
      "description": "Query the user's local memory blob with optional text filtering.",
      "name": "query_user_memory_blob",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Delete one memory line by id from the local blob.",
      "name": "delete_user_memory_line",
      "required_inputs": [
        "user_id",
        "line_id"
      ]
    },
    {
      "description": "Save a job to the user's local shortlist for follow-up.",
      "name": "save_job_for_later",
      "optional_inputs": [
        "job_url",
        "result_id",
        "session_id"
      ],
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "List saved jobs in reverse-chronological order.",
      "name": "list_saved_jobs",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Remove one saved job from the local shortlist.",
      "name": "delete_saved_job",
      "required_inputs": [
        "user_id",
        "saved_job_id"
      ]
    },
    {
      "description": "Hide one job from future results for this user.",
      "name": "ignore_job",
      "optional_inputs": [
        "job_url",
        "result_id",
        "session_id"
      ],
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "List ignored jobs in reverse-chronological order.",
      "name": "list_ignored_jobs",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Unhide a previously ignored job by id.",
      "name": "unignore_job",
      "required_inputs": [
        "user_id",
        "ignored_job_id"
      ]
    },
    {
      "description": "Hide all jobs from a company in future searches.",
      "name": "ignore_company",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "List ignored companies in reverse-chronological order.",
      "name": "list_ignored_companies",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Remove one company from the ignored list.",
      "name": "unignore_company",
      "required_inputs": [
        "user_id",
        "ignored_company_id"
      ]
    },
    {
      "description": "Mark a job as applied and persist pipeline state.",
      "name": "mark_job_applied",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Update lifecycle stage for a tracked job (saved/applied/interview/etc).",
      "name": "update_job_stage",
      "required_inputs": [
        "user_id",
        "stage"
      ]
    },
    {
      "description": "List tracked jobs filtered by lifecycle stage.",
      "name": "list_jobs_by_stage",
      "required_inputs": [
        "user_id",
        "stage"
      ]
    },
    {
      "description": "Attach or append a note to a tracked job record.",
      "name": "add_job_note",
      "required_inputs": [
        "user_id",
        "note"
      ]
    },
    {
      "description": "List recent stage transitions and lifecycle events.",
      "name": "list_recent_job_events",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Summarize tracked pipeline counts by stage for one user.",
      "name": "get_job_pipeline_summary",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Delete one cached search session or all sessions for a user.",
      "name": "clear_search_session",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Export all local records for a user across stores.",
      "name": "export_user_data",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Permanently delete all local records for a user.",
      "name": "delete_user_data",
      "required_inputs": [
        "user_id",
        "confirm"
      ]
    },
    {
      "description": "Suggest best outreach channel/contact for a job.",
      "name": "get_best_contact_strategy",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Generate a practical outreach draft tailored to user and role.",
      "name": "generate_outreach_message",
      "required_inputs": [
        "user_id"
      ]
    },
    {
      "description": "Start a background job search without requiring visa preferences.",
      "name": "start_job_search",
      "required_inputs": [
        "location",
        "job_title",
        "user_id"
      ]
    },
    {
      "description": "Poll incremental progress/events for a background job search run.",
      "name": "get_job_search_status",
      "required_inputs": [
        "user_id",
        "run_id"
      ]
    },
    {
      "description": "Fetch current result page from a background job search run.",
      "name": "get_job_search_results",
      "required_inputs": [
        "user_id",
        "run_id"
      ]
    },
    {
      "description": "Request cancellation of an in-progress background job search run.",
      "name": "cancel_job_search",
      "required_inputs": [
        "user_id",
        "run_id"
      ]
    },
    {
      "description": "Start a background search run for long scans.",
      "name": "start_visa_job_search",
      "required_inputs": [
        "location",
        "job_title",
        "user_id"
      ]
    },
    {
      "description": "Poll incremental progress/events for a background search run.",
      "name": "get_visa_job_search_status",
      "required_inputs": [
        "user_id",
        "run_id"
      ]
    },
    {
      "description": "Fetch current result page from a background search run.",
      "name": "get_visa_job_search_results",
      "required_inputs": [
        "user_id",
        "run_id"
      ]
    },
    {
      "description": "Request cancellation of an in-progress background run.",
      "name": "cancel_visa_job_search",
      "required_inputs": [
        "user_id",
        "run_id"
      ]
    },
    {
      "description": "Discover latest DOL LCA/PERM disclosure sources.",
      "name": "discover_latest_dol_disclosure_urls",
      "required_inputs": []
    },
    {
      "description": "Run internal pipeline to refresh sponsor-company dataset.",
      "name": "run_internal_dol_pipeline",
      "required_inputs": []
    },
    {
      "description": "Clear and reload in-memory company dataset cache.",
      "name": "refresh_company_dataset_cache",
      "required_inputs": []
    }
  ],
  "version": "0.3.1"
}

Regenera esta sección y el bloque de contrato del sitio web con:

python3 scripts/generate_contract_docs.py

Valida que los bloques generados estén actualizados:

python3 scripts/generate_contract_docs.py --check

CLI manual (opcional)

Verifica la versión del binario:

visa-jobs-mcp --version

Ejecuta el servidor MCP directamente (para depuración):

visa-jobs-mcp

Ejecuta el pipeline interno de DOL (flujo de trabajo del mantenedor, desde el checkout del código fuente):

./scripts/run_internal_pipeline.sh

Solución de problemas

  • Si la búsqueda no devuelve empleos, sigue consultando get_visa_job_search_status y llama a get_visa_job_search_results nuevamente para el mismo run_id.
  • Si ocurren límites de tasa del proveedor, espera unos minutos y reintenta.
  • Si la instalación con Homebrew falla debido a activos de versión faltantes, reintenta después de que se completen los flujos de trabajo de versión.

Datos y privacidad

  • Los datos se almacenan localmente de forma predeterminada.
  • Sin telemetría ni venta de datos externos.
  • La coincidencia de patrocinio utiliza data/companies.csv y los resultados del pipeline basado en DOL.

Para mantenedores

  • Repositorio de tap de Homebrew: https://github.com/neosh11/homebrew-visa-jobs-mcp
  • Guía para contribuyentes: AGENTS.md
  • Flujo de trabajo de versiones: .github/workflows/build-release-binaries.yml
  • Compilación local de artefactos de versión: ./scripts/build_release_binaries.sh (binario nativo de Go + data/companies.csv incluido)

Licencia

MIT. Ver LICENSE.