Marketgenius

Our free Marketgenius investment tools as live, interactive React MCP Apps.

¿Debería usar esto?

Calidad y seguridad

A
Calidad de la descripción
100%
Integridad del esquema
92%
Calidad de los nombres
75%
Riesgo de envenenamiento
100%
Coincidencia de permisos
100%
Cumplimiento del protocolo
100%

Hallazgos (4)

  • LOWTool 'mg_calculator_market_cap_update' name length outside 3-30 rangeen mg_calculator_market_cap_update
  • LOWTool 'mg_calculator_profit_margin_update' name length outside 3-30 rangeen mg_calculator_profit_margin_update
  • LOWTool 'mg_calculator_profit_margin_sync' name length outside 3-30 rangeen mg_calculator_profit_margin_sync
  • LOWTool 'mg_calculator_profit_margin_state' name length outside 3-30 rangeen mg_calculator_profit_margin_state

Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.

Costo de contexto

~4,746Tokens (definiciones de herramientas)
~2.3 KBTamaño de respuesta típico
Impacto significativo en la atención (3.71% del contexto de 128k)

Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.

Instalar

Instalación con un clic

Agrega esto a tu archivo `claude_desktop_config.json`:

{
  "mcpServers": {
    "mcp": {
      "url": "https://marketgenius.app/mcp"
    }
  }
}

Puntos de conexión remotos

https://marketgenius.app/mcpstreamable-http

Qué puede hacer

Inventario de herramientas

Herramientas (17)

🟢 Solo lectura🟡 Escritura🔴 Eliminación⚪ Desconocido
🟢mg_list(category)

List all available Marketgenius tools with their names, descriptions, categories, and resource URIs. Use mg_list to discover what's available, or filter by category.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "category": {
      "description": "Filter by category. Omit to list all tools.",
      "type": "string",
      "enum": [
        "calculators"
      ]
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪mg_calculator_cagr(currencySymbol, beginningValue, endingValue, years)

Open the CAGR Calculator React MCP App UI. ALWAYS ask first — never call this tool silently: "Open the calculator directly, or pre-fill it with your inputs?" IF directly → call this tool now with no params. STOP. Do not ask anything else. IF pre-fill → collect only the input schema fields — do not guess or invent field names.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "beginningValue": {
      "default": "10000",
      "description": "Beginning (initial) investment value.",
      "type": "string"
    },
    "endingValue": {
      "default": "20000",
      "description": "Ending (final) investment value.",
      "type": "string"
    },
    "years": {
      "default": 10,
      "description": "Number of years of investment. Default: 0",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡mg_calculator_cagr_update(sessionId, currencySymbol, beginningValue, endingValue, years, ...)

Update one or more fields in the already-open CAGR Calculator. ALWAYS call mg_calculator_cagr_state first — the user may have changed values manually in the GUI and you must not overwrite them. Pass the version you received from that call (or from the open tool if updating immediately after opening). Only pass the fields the user explicitly asked to change; omit all others. Send all changes in a single call — multiple sequential calls lose intermediate updates (only the last one applies).

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Session ID returned by the open tool."
    },
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "beginningValue": {
      "default": "10000",
      "description": "Beginning (initial) investment value.",
      "type": "string"
    },
    "endingValue": {
      "default": "20000",
      "description": "Ending (final) investment value.",
      "type": "string"
    },
    "years": {
      "default": 10,
      "description": "Number of years of investment. Default: 0",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "version": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Current session version — call mg_calculator_cagr_state first to get this."
    }
  },
  "required": [
    "sessionId",
    "version"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢mg_calculator_cagr_sync(sessionId, currencySymbol, beginningValue, endingValue, years)

Sync user-entered field values of the open CAGR Calculator back to the session store so the model can read them via the state tool. Called by the View after any field change; hidden from the model.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Session ID returned by the open tool."
    },
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "beginningValue": {
      "default": "10000",
      "description": "Beginning (initial) investment value.",
      "type": "string"
    },
    "endingValue": {
      "default": "20000",
      "description": "Ending (final) investment value.",
      "type": "string"
    },
    "years": {
      "default": 10,
      "description": "Number of years of investment. Default: 0",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "sessionId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢mg_calculator_cagr_state(sessionId)

Read the current field values of the open CAGR Calculator. Call this before answering any question about the current values — the user may have changed fields manually in the GUI. Do not call this on a loop; call it once on demand.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string"
    }
  },
  "required": [
    "sessionId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪mg_calculator_dividend(mode, currencySymbol, baInitialInvestment, baDepositAmount, baDepositMonths, ...)

Open the Dividend Calculator React MCP App UI. ALWAYS ask first — never call this tool silently: "Open the calculator directly, or pre-fill it with your inputs?" IF directly → call this tool now with no params. STOP. Do not ask anything else. IF pre-fill → ask "By amount invested or by number of shares?", then collect only the input schema fields matching that mode — do not guess or invent field names.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "mode": {
      "default": "amount",
      "description": "Entry mode. Default: \"amount\"",
      "type": "string",
      "enum": [
        "amount",
        "shares"
      ]
    },
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "baInitialInvestment": {
      "default": "10000",
      "description": "By amount: Initial investment amount.",
      "type": "string"
    },
    "baDepositAmount": {
      "default": "200",
      "description": "By amount: Monthly deposit amount.",
      "type": "string"
    },
    "baDepositMonths": {
      "default": 1,
      "description": "By amount: Deposit months per year (1-12). Default: 1",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "baDividendYield": {
      "default": "3",
      "description": "By amount: Dividend yield percentage.",
      "type": "string"
    },
    "baDividendGrowthRate": {
      "default": 5,
      "description": "By amount: Annual dividend growth rate %. Default: 0",
      "type": "number"
    },
    "baSharePriceGrowthRate": {
      "default": 6,
      "description": "By amount: Annual price growth rate %. Default: 0",
      "type": "number"
    },
    "baProjectionPeriod": {
      "default": 20,
      "description": "By amount: Projection period in years. Default: 0",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "baReinvest": {
      "default": true,
      "description": "By amount: Reinvest dividends. Default: true",
      "type": "boolean"
    },
    "baInflationRate": {
      "default": 0,
      "description": "By amount: Inflation rate %. Default: 0",
      "type": "number"
    },
    "bsShares": {
      "default": "500",
      "description": "By shares: Number of shares.",
      "type": "string"
    },
    "bsSharePrice": {
      "default": "50",
      "description": "By shares: Share price.",
      "type": "string"
    },
    "bsSharePriceGrowthRate": {
      "default": 6,
      "description": "By shares: Annual price growth rate %. Default: 0",
      "type": "number"
    },
    "bsDividendYield": {
      "default": "3",
      "description": "By shares: Dividend yield percentage.",
      "type": "string"
    },
    "bsDividendGrowthRate": {
      "default": 5,
      "description": "By shares: Annual dividend growth rate %. Default: 0",
      "type": "number"
    },
    "bsProjectionPeriod": {
      "default": 20,
      "description": "By shares: Projection period in years. Default: 0",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "bsReinvest": {
      "default": true,
      "description": "By shares: Reinvest dividends. Default: true",
      "type": "boolean"
    },
    "bsInflationRate": {
      "default": 0,
      "description": "By shares: Inflation rate %. Default: 0",
      "type": "number"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡mg_calculator_dividend_update(sessionId, mode, currencySymbol, baInitialInvestment, baDepositAmount, ...)

Update one or more fields in the already-open Dividend Calculator. ALWAYS call mg_calculator_dividend_state first — the user may have changed values manually in the GUI and you must not overwrite them. Pass the version you received from that call (or from the open tool if updating immediately after opening). Only pass the fields the user explicitly asked to change; omit all others. Send all changes in a single call — multiple sequential calls lose intermediate updates (only the last one applies).

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Session ID returned by the open tool."
    },
    "mode": {
      "default": "amount",
      "description": "Entry mode. Default: \"amount\"",
      "type": "string",
      "enum": [
        "amount",
        "shares"
      ]
    },
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "baInitialInvestment": {
      "default": "10000",
      "description": "By amount: Initial investment amount.",
      "type": "string"
    },
    "baDepositAmount": {
      "default": "200",
      "description": "By amount: Monthly deposit amount.",
      "type": "string"
    },
    "baDepositMonths": {
      "default": 1,
      "description": "By amount: Deposit months per year (1-12). Default: 1",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "baDividendYield": {
      "default": "3",
      "description": "By amount: Dividend yield percentage.",
      "type": "string"
    },
    "baDividendGrowthRate": {
      "default": 5,
      "description": "By amount: Annual dividend growth rate %. Default: 0",
      "type": "number"
    },
    "baSharePriceGrowthRate": {
      "default": 6,
      "description": "By amount: Annual price growth rate %. Default: 0",
      "type": "number"
    },
    "baProjectionPeriod": {
      "default": 20,
      "description": "By amount: Projection period in years. Default: 0",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "baReinvest": {
      "default": true,
      "description": "By amount: Reinvest dividends. Default: true",
      "type": "boolean"
    },
    "baInflationRate": {
      "default": 0,
      "description": "By amount: Inflation rate %. Default: 0",
      "type": "number"
    },
    "bsShares": {
      "default": "500",
      "description": "By shares: Number of shares.",
      "type": "string"
    },
    "bsSharePrice": {
      "default": "50",
      "description": "By shares: Share price.",
      "type": "string"
    },
    "bsSharePriceGrowthRate": {
      "default": 6,
      "description": "By shares: Annual price growth rate %. Default: 0",
      "type": "number"
    },
    "bsDividendYield": {
      "default": "3",
      "description": "By shares: Dividend yield percentage.",
      "type": "string"
    },
    "bsDividendGrowthRate": {
      "default": 5,
      "description": "By shares: Annual dividend growth rate %. Default: 0",
      "type": "number"
    },
    "bsProjectionPeriod": {
      "default": 20,
      "description": "By shares: Projection period in years. Default: 0",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "bsReinvest": {
      "default": true,
      "description": "By shares: Reinvest dividends. Default: true",
      "type": "boolean"
    },
    "bsInflationRate": {
      "default": 0,
      "description": "By shares: Inflation rate %. Default: 0",
      "type": "number"
    },
    "version": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Current session version — call mg_calculator_dividend_state first to get this."
    }
  },
  "required": [
    "sessionId",
    "version"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢mg_calculator_dividend_sync(sessionId, mode, currencySymbol, baInitialInvestment, baDepositAmount, ...)

Sync user-entered field values of the open Dividend Calculator back to the session store so the model can read them via the state tool. Called by the View after any field change; hidden from the model.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Session ID returned by the open tool."
    },
    "mode": {
      "default": "amount",
      "description": "Entry mode. Default: \"amount\"",
      "type": "string",
      "enum": [
        "amount",
        "shares"
      ]
    },
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "baInitialInvestment": {
      "default": "10000",
      "description": "By amount: Initial investment amount.",
      "type": "string"
    },
    "baDepositAmount": {
      "default": "200",
      "description": "By amount: Monthly deposit amount.",
      "type": "string"
    },
    "baDepositMonths": {
      "default": 1,
      "description": "By amount: Deposit months per year (1-12). Default: 1",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "baDividendYield": {
      "default": "3",
      "description": "By amount: Dividend yield percentage.",
      "type": "string"
    },
    "baDividendGrowthRate": {
      "default": 5,
      "description": "By amount: Annual dividend growth rate %. Default: 0",
      "type": "number"
    },
    "baSharePriceGrowthRate": {
      "default": 6,
      "description": "By amount: Annual price growth rate %. Default: 0",
      "type": "number"
    },
    "baProjectionPeriod": {
      "default": 20,
      "description": "By amount: Projection period in years. Default: 0",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "baReinvest": {
      "default": true,
      "description": "By amount: Reinvest dividends. Default: true",
      "type": "boolean"
    },
    "baInflationRate": {
      "default": 0,
      "description": "By amount: Inflation rate %. Default: 0",
      "type": "number"
    },
    "bsShares": {
      "default": "500",
      "description": "By shares: Number of shares.",
      "type": "string"
    },
    "bsSharePrice": {
      "default": "50",
      "description": "By shares: Share price.",
      "type": "string"
    },
    "bsSharePriceGrowthRate": {
      "default": 6,
      "description": "By shares: Annual price growth rate %. Default: 0",
      "type": "number"
    },
    "bsDividendYield": {
      "default": "3",
      "description": "By shares: Dividend yield percentage.",
      "type": "string"
    },
    "bsDividendGrowthRate": {
      "default": 5,
      "description": "By shares: Annual dividend growth rate %. Default: 0",
      "type": "number"
    },
    "bsProjectionPeriod": {
      "default": 20,
      "description": "By shares: Projection period in years. Default: 0",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "bsReinvest": {
      "default": true,
      "description": "By shares: Reinvest dividends. Default: true",
      "type": "boolean"
    },
    "bsInflationRate": {
      "default": 0,
      "description": "By shares: Inflation rate %. Default: 0",
      "type": "number"
    }
  },
  "required": [
    "sessionId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢mg_calculator_dividend_state(sessionId)

Read the current field values of the open Dividend Calculator. Call this before answering any question about the current values — the user may have changed fields manually in the GUI. Do not call this on a loop; call it once on demand.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string"
    }
  },
  "required": [
    "sessionId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪mg_calculator_market_cap(currencySymbol, marketCap, sharePrice, sharesOutstanding)

Open the Market Cap Calculator React MCP App UI. ALWAYS ask first — never call this tool silently: "Open the calculator directly, or pre-fill it with your inputs?" IF directly → call this tool now with no params. STOP. Do not ask anything else. IF pre-fill → ask "Would you like to pre-fill share price and shares outstanding?", then collect only the input schema fields matching that mode — do not guess or invent field names.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "marketCap": {
      "default": "",
      "description": "Market capitalization.",
      "type": "string"
    },
    "sharePrice": {
      "default": "150",
      "description": "Price per share.",
      "type": "string"
    },
    "sharesOutstanding": {
      "default": "1000000000",
      "description": "Total shares outstanding.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡mg_calculator_market_cap_update(sessionId, currencySymbol, marketCap, sharePrice, sharesOutstanding, ...)

Update one or more fields in the already-open Market Cap Calculator. ALWAYS call mg_calculator_market_cap_state first — the user may have changed values manually in the GUI and you must not overwrite them. Pass the version you received from that call (or from the open tool if updating immediately after opening). Only pass the fields the user explicitly asked to change; omit all others. Send all changes in a single call — multiple sequential calls lose intermediate updates (only the last one applies).

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Session ID returned by the open tool."
    },
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "marketCap": {
      "default": "",
      "description": "Market capitalization.",
      "type": "string"
    },
    "sharePrice": {
      "default": "150",
      "description": "Price per share.",
      "type": "string"
    },
    "sharesOutstanding": {
      "default": "1000000000",
      "description": "Total shares outstanding.",
      "type": "string"
    },
    "version": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Current session version — call mg_calculator_market_cap_state first to get this."
    }
  },
  "required": [
    "sessionId",
    "version"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢mg_calculator_market_cap_sync(sessionId, currencySymbol, marketCap, sharePrice, sharesOutstanding)

Sync user-entered field values of the open Market Cap Calculator back to the session store so the model can read them via the state tool. Called by the View after any field change; hidden from the model.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Session ID returned by the open tool."
    },
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "marketCap": {
      "default": "",
      "description": "Market capitalization.",
      "type": "string"
    },
    "sharePrice": {
      "default": "150",
      "description": "Price per share.",
      "type": "string"
    },
    "sharesOutstanding": {
      "default": "1000000000",
      "description": "Total shares outstanding.",
      "type": "string"
    }
  },
  "required": [
    "sessionId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢mg_calculator_market_cap_state(sessionId)

Read the current field values of the open Market Cap Calculator. Call this before answering any question about the current values — the user may have changed fields manually in the GUI. Do not call this on a loop; call it once on demand.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string"
    }
  },
  "required": [
    "sessionId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪mg_calculator_profit_margin(currencySymbol, revenue, cost)

Open the Profit Margin Calculator React MCP App UI. ALWAYS ask first — never call this tool silently: "Open the calculator directly, or pre-fill it with your inputs?" IF directly → call this tool now with no params. STOP. Do not ask anything else. IF pre-fill → ask "Would you like to pre-fill revenue and cost?", then collect only the input schema fields matching that mode — do not guess or invent field names.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "revenue": {
      "default": "10000000",
      "description": "Annual revenue.",
      "type": "string"
    },
    "cost": {
      "default": "7000000",
      "description": "Cost of goods sold.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡mg_calculator_profit_margin_update(sessionId, currencySymbol, revenue, cost, version)

Update one or more fields in the already-open Profit Margin Calculator. ALWAYS call mg_calculator_profit_margin_state first — the user may have changed values manually in the GUI and you must not overwrite them. Pass the version you received from that call (or from the open tool if updating immediately after opening). Only pass the fields the user explicitly asked to change; omit all others. Send all changes in a single call — multiple sequential calls lose intermediate updates (only the last one applies).

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Session ID returned by the open tool."
    },
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "revenue": {
      "default": "10000000",
      "description": "Annual revenue.",
      "type": "string"
    },
    "cost": {
      "default": "7000000",
      "description": "Cost of goods sold.",
      "type": "string"
    },
    "version": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Current session version — call mg_calculator_profit_margin_state first to get this."
    }
  },
  "required": [
    "sessionId",
    "version"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢mg_calculator_profit_margin_sync(sessionId, currencySymbol, revenue, cost)

Sync user-entered field values of the open Profit Margin Calculator back to the session store so the model can read them via the state tool. Called by the View after any field change; hidden from the model.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Session ID returned by the open tool."
    },
    "currencySymbol": {
      "description": "Currency symbol, e.g. \"$\" or \"€\". Default: \"$\"",
      "type": "string"
    },
    "revenue": {
      "default": "10000000",
      "description": "Annual revenue.",
      "type": "string"
    },
    "cost": {
      "default": "7000000",
      "description": "Cost of goods sold.",
      "type": "string"
    }
  },
  "required": [
    "sessionId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢mg_calculator_profit_margin_state(sessionId)

Read the current field values of the open Profit Margin Calculator. Call this before answering any question about the current values — the user may have changed fields manually in the GUI. Do not call this on a loop; call it once on demand.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string"
    }
  },
  "required": [
    "sessionId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Comunidad

Califica este servidor

Evidencia

Observaciones recientes

verificadoversión no registrada17 herramientas
verificadoversión no registrada17 herramientas