microsoft / microsoft/work-iq

fetch: server-issued @odata.nextLink/$skiptoken on /chats/{chat-id}/messages is rejected by its own endpoint (Unknown error)

Open
#158 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
PowerShell
Stars
1k
Forks
132
Avg merge
5d 19h
Merged PRs (30d)
6

Description

Prepared by Claude.

Summary

On the hosted Work IQ MCP endpoint (https://workiq.svc.cloud.microsoft/mcp), fetch on /chats/{chat-id}/messages issues an @odata.nextLink continuation that its own endpoint then rejects. Every attempt to follow the server-issued $skiptoken fails with "Unknown error", making chat history beyond the first page unreachable via the documented pagination mechanism. The response schema (via get_schema) still advertises @odata.nextLink in the collection response.

Environment
  • Hosted Work IQ MCP prod endpoint, tested 2026-07-08 and 2026-07-09
  • Reproduced independently by two users in the same tenant, on multiple real chats (meeting chats and 1:1s)
  • Persistent, not transient — the base call succeeds between continuation attempts
Repro
  1. fetch {"entityUrls":["/chats/{chat-id}/messages?$top=50"]} against any chat with more than ~10 messages.
    • Returns a small page (observed 10–20 messages regardless of $top), newest-first by lastModifiedDateTime, plus an @odata.nextLink containing a $skiptoken.
  2. fetch the returned @odata.nextLink — verbatim, exactly as issued.
    • Result: "Unknown error".
  3. Variants tried (~10): relative path vs absolute URL, uppercase/lowercase percent-encoding, decoded token, double-encoded token. All fail identically.
Also rejected on this path
  • $filter on createdDateTime (rejected)
  • $orderby=createdDateTime in either direction (rejected)
  • messages/delta via call_function (rejected)

The only working paging lever we found is $orderby=lastModifiedDateTime desc combined with $filter=lastModifiedDateTime gt <T1> and lastModifiedDateTime lt <T2> — walking lt backward window by window. That workaround is complete (since lastModifiedDateTime >= createdDateTime) but costs one call per ~10 messages and returns items out of created order (edits/reactions bump lastModifiedDateTime).

Expected

Following the exact continuation URL the server issued should return the next page, per the schema's advertised @odata.nextLink contract.

Impact

Any agent that needs more than the first page of a Teams chat (meeting recaps, thread summarization, "what did I miss") either dead-ends or burns many failed calls discovering the wall. Before we documented the workaround internally, a scheduled recap agent spent nine failed tool calls on continuation attempts and produced no output.

Notes
  • Observed on chat messages (/chats/{chat-id}/messages); channel messages not tested for this behavior.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the issue against the hosted Work IQ MCP endpoint using fetch on /chats/{chat-id}/messages?$top=50, then retry the exact @odata.nextLink returned by the response. No repository file or test is identified; done means the server-issued continuation returns the next page instead of "Unknown error", while preserving the documented pagination contract.

Written by the indexing model from the issue text.

Assessment

Domain
api
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.