{"record":{"id":"8907070897c8df12","repo":"neoclide/coc.nvim","slug":"language-server-id-not-found","errorCode":null,"errorMessage":"Language server ${id} not found","messagePattern":"Language server (.+?) not found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/services.ts","lineNumber":275,"sourceCode":"  }\n\n  private registerClientsByConfig(lspConfig: { [key: string]: LanguageServerConfig }, folder?: URI): void {\n    for (let key of Object.keys(toObject(lspConfig))) {\n      let config: LanguageServerConfig = lspConfig[key]\n      if (!isValidServerConfig(key, config)) {\n        continue\n      }\n      this.registerLanguageClient(key, config, folder)\n    }\n  }\n\n  private async getLanguageClient(id: string): Promise<LanguageClient> {\n    let service = this.getService(id)\n    // wait for extension activate\n    if (!service) await wait(100)\n    service = this.getService(id)\n    if (!service || !service.client) {\n      throw new Error(`Language server ${id} not found`)\n    }\n    return service.client\n  }\n  /**\n   * @internal\n   */\n\n  public async sendNotification(id: string, method: string, params?: any): Promise<void> {\n    let client = await this.getLanguageClient(id)\n    await Promise.resolve(client.sendNotification(method, params))\n  }\n  /**\n   * @internal\n   */\n\n  public async sendRequest(id: string, method: string, params?: any, token?: CancellationToken): Promise<any> {\n    let client = await this.getLanguageClient(id)\n    token = token ?? CancellationToken.None","sourceCodeStart":257,"sourceCodeEnd":293,"githubUrl":"https://github.com/neoclide/coc.nvim/blob/50e974d9692461a69147d5cab146a8d3e439abe4/src/services.ts#L257-L293","documentation":"getLanguageClient resolves the LanguageClient backing a language service. If the service is still missing after waiting 100ms for extension activation, or exists but has no client yet, it throws. This usually means the language server was never registered or is still initializing.","triggerScenarios":"Calling services.getLanguageClient(id) (or the client accessor) before the language extension activates, or for a service created without a client, or with a wrong id.","commonSituations":"Vimrc/autocmd triggers a request on FileType before coc completes extension activation; server failed to spawn leaving service without a client.","solutions":["Confirm the id matches a registered language service.","Wait for service state to become Running before requesting the client (poll state or listen to service events).","Check the language extension is installed and activated for the buffer's filetype.","Inspect service.start failure logs if the client never attaches."],"exampleFix":"// before\nlet client = await services.getLanguageClient('tsserver')\n// after\nlet service = services.getService('tsserver')\nif (!service || service.state !== ServiceStat.Running) return\nlet client = await services.getLanguageClient('tsserver')","handlingStrategy":"retry","validationCode":"let service = services.getService(id)\nif (!service || service.state !== ServiceStat.Running) return null","typeGuard":"function hasClient(id: string): boolean {\n  let s = services.getService(id)\n  return s != null && s.client != null\n}","tryCatchPattern":"try {\n  return await services.getLanguageClient(id)\n} catch (e) {\n  logger.warn(`client for ${id} unavailable: ${e.message}`)\n  return null\n}","preventionTips":["Wait for the service to reach Running state before requesting the client.","Don't call client accessors in autocmds that can fire before activation.","Install/enable the language extension for relevant filetypes.","Check server spawn logs if the client never attaches."],"tags":["lsp","services","initialization"],"backgroundTag":"language-server-not-ready","analyzedSha":"50e974d9692461a69147d5cab146a8d3e439abe4","analyzedAt":"2026-08-31T11:17:23.966Z","schemaVersion":2},"datasetVersion":"2026-09-01T08:17:40.651Z"}