{"_id":"@bossforce.ai/mcp-looker","name":"@bossforce.ai/mcp-looker","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@bossforce.ai/mcp-looker","version":"0.1.0","type":"module","repository":{"type":"git","url":"git+https://github.com/bossforce-ai/bossforce-tools.git","directory":"mcps/bi-dashboards/looker"},"publishConfig":{"access":"public"},"bin":{"bossforce-mcp-looker":"dist/bin.js"},"dependencies":{"zod":"^4.4.3","@bossforce.ai/mcp-core":"0.3.0"},"devDependencies":{"@bossforce.ai/mcp-testkit":"0.0.0"},"scripts":{"build":"tsc -p tsconfig.json","test":"node --test \"dist/*.test.js\""},"_id":"@bossforce.ai/mcp-looker@0.1.0","description":"MCP server for the [Looker](https://cloud.google.com/looker) **API 4.0**, using API3 client-credentials authentication. A good fit for listing Looks and dashboards, running a saved Look, or running an ad-hoc inline query from an agent.","bugs":{"url":"https://github.com/bossforce-ai/bossforce-tools/issues"},"homepage":"https://github.com/bossforce-ai/bossforce-tools#readme","_integrity":"sha512-oW7x7jeBNGorGT6dp3UwG+ADf64D5rp2bVHLvfPbUO0FleZ8Ja1tOcm+cMfLGCpi7DURpiDWFrKbt2TzydWFhA==","_resolved":"C:\\Users\\user\\AppData\\Local\\Temp\\bb789641d44adbf118af5837285cd4f9\\bossforce.ai-mcp-looker-0.1.0.tgz","_from":"file:bossforce.ai-mcp-looker-0.1.0.tgz","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-oW7x7jeBNGorGT6dp3UwG+ADf64D5rp2bVHLvfPbUO0FleZ8Ja1tOcm+cMfLGCpi7DURpiDWFrKbt2TzydWFhA==","shasum":"0668a1fee3d0b45fe3eeed7f413c772d80b97a6b","tarball":"https://registry.npmjs.org/@bossforce.ai/mcp-looker/-/mcp-looker-0.1.0.tgz","fileCount":26,"unpackedSize":32256,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDei2Vs3/mLy35dq3WoM518QqUAocWgdqRfzWzjbughcAIhAPczVFcV41OvnQ5Z3qHgGmvmErnLh1l4PGqSMHfJkOmE"}]},"_npmUser":{"name":"bossforce.ai","email":"bossforce.ai@gmail.com"},"directories":{},"maintainers":[{"name":"bossforce.ai","email":"bossforce.ai@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-looker_0.1.0_1781069229142_0.9533734338784263"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-10T05:27:09.003Z","0.1.0":"2026-06-10T05:27:09.335Z","modified":"2026-06-10T05:27:09.563Z"},"maintainers":[{"name":"bossforce.ai","email":"bossforce.ai@gmail.com"}],"description":"MCP server for the [Looker](https://cloud.google.com/looker) **API 4.0**, using API3 client-credentials authentication. A good fit for listing Looks and dashboards, running a saved Look, or running an ad-hoc inline query from an agent.","homepage":"https://github.com/bossforce-ai/bossforce-tools#readme","repository":{"type":"git","url":"git+https://github.com/bossforce-ai/bossforce-tools.git","directory":"mcps/bi-dashboards/looker"},"bugs":{"url":"https://github.com/bossforce-ai/bossforce-tools/issues"},"readme":"# @bossforce.ai/mcp-looker\n\nMCP server for the [Looker](https://cloud.google.com/looker) **API 4.0**, using\nAPI3 client-credentials authentication. A good fit for listing Looks and\ndashboards, running a saved Look, or running an ad-hoc inline query from an\nagent.\n\n## Credentials\n\n| Env                    | Secret | How to obtain                                                                                                              |\n| ---------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------- |\n| `LOOKER_BASE_URL`      | no     | API host base URL of your instance, e.g. `https://acme.looker.com:19999` (legacy port) or `https://acme.cloud.looker.com`. |\n| `LOOKER_CLIENT_ID`     | yes    | API3 Client ID created under Admin > Users > Edit > [API Keys](https://cloud.google.com/looker/docs/api-auth).             |\n| `LOOKER_CLIENT_SECRET` | yes    | API3 Client Secret paired with the Client ID (shown only once).                                                            |\n\nCredentials are read lazily, so the server boots and answers `tools/list`\nwithout them; calls fail with an `auth` error until they are set. The access\ntoken inherits the permissions of the user the API key belongs to, so listing\nand running content requires that user to have access to the relevant models\nand folders.\n\n## Authentication\n\nLooker uses a two-step flow. The client first POSTs the Client ID and Client\nSecret to `{LOOKER_BASE_URL}/api/4.0/login` to obtain a short-lived OAuth2\naccess token, caches it, and sends it as a `Bearer` token on subsequent calls.\nOn a `401` it re-authenticates once and retries. The API base URL is built from\n`LOOKER_BASE_URL` as `{LOOKER_BASE_URL}/api/4.0`.\n\n## Tools\n\n| Tool              | Arguments                                                                                                          | Returns                                      |\n| ----------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------- |\n| `list_looks`      | `fields?`                                                                                                          | List of saved Looks                          |\n| `list_dashboards` | `fields?`                                                                                                          | List of dashboards                           |\n| `run_look`        | `look_id`, `result_format`, `limit?`, `apply_formatting?`, `apply_vis?`, `cache?`                                  | Look results in the requested format         |\n| `run_query`       | `model`, `view`, `fields`, `result_format`, `filters?`, `sorts?`, `limit?`, `query_timezone?`, `apply_formatting?` | Inline query results in the requested format |\n\n`result_format` accepts `json`, `json_detail`, `csv`, `txt`, `html`, `md`,\n`xlsx`, `sql`, `png`, `jpg`. `json` is parsed into `structuredContent`; other\nformats are returned as text.\n\n### Discovering ids\n\n`list_looks` returns the numeric `look_id` used by `run_look`. `list_dashboards`\nreturns dashboard metadata. Use the `fields` argument to trim the columns\nreturned per item.\n\n### Running queries\n\n`run_look` runs a saved Look by id\n(`GET /api/4.0/looks/{look_id}/run/{result_format}`). `run_query` runs an ad-hoc\ninline query (`POST /api/4.0/queries/run/{result_format}`) built from a LookML\n`model`, `view` (explore) and `fields`; add `filters`, `sorts` and `limit` to\nshape the result.\n\n## Develop\n\n```bash\npnpm --filter @bossforce.ai/mcp-looker build\npnpm --filter @bossforce.ai/mcp-looker test\n```\n\nRegenerate the tools/list snapshot after an intentional signature change:\n\n```bash\nUPDATE_SNAPSHOTS=1 pnpm --filter @bossforce.ai/mcp-looker test\n```\n","readmeFilename":"README.md","_rev":"1-b468160be65f605005cd1f32f6a1156a"}