Faits: Faits: A. B._, née en 1945, a travaillé à temps partiel (70 %) en qualité d'employée d'une cafeteria. Parallèlement, elle s'occupe de son ménage. Invoquant des problèmes d'arthrose, elle s'est annoncée à l'assurance-invalidité le 7 mars 2001. Selon le docteur K._, médecin traitant, sa patiente souffre notamment de dorso-lombalgies ainsi qu'un état dépressif qui l'empêchent totalement d'exercer son activité lucrative (rapports des 4 mai et 4 octobre 2001). L'Office de l'assurance-invalidité du canton de Neuchâtel (l'office AI) a diligenté une enquête économique sur le ménage puis confié un mandat d'expertise au docteur S._, spécialiste en médecine interne et maladies rhumatismales. Se fondant sur les rapports d'enquête économique (du 21 juin 2002) et de l'expert S._ (du 14 octobre 2002), l'office AI a soumis un projet de décision à l'assurée, le 9 décembre 2002, selon lequel il envisageait de rejeter la demande de rente dès lors que le taux d'invalidité s'élevait à 21,5 % (14 % dans l'activité lucrative, 6,5 % dans les tâches ménagères). Dans ce projet, l'office AI a également imparti un délai de deux semaines à l'assurée afin qu'elle puisse présenter, par écrit ou verbalement, d'éventuelles objections à l'encontre de ce projet ou requérir des renseignements complémentaires. Le 18 décembre 2002, l'assurée s'est opposée par téléphone au projet de décision. Ses moyens sont résumés en ces termes dans le procès-verbal de l'office AI : « Elle ne comprend pas la décision que nous projetons de prendre. Le projet de décision a été soumis à son médecin traitant, le docteur K._. Selon ce dernier, nous avons mal interprété les conclusions de l'expert rhumatologue (docteur S._), l'incapacité de travail étant de 50 % dans l'activité d'employée responsable de cafeteria à temps partiel (70 %). En conséquence, elle nous demande de revoir notre projet de décision en tenant compte de cet élément. » Après que le juriste et le médecin de l'office AI eurent estimé que les arguments de l'assurée n'étaient pas de nature à modifier la position de l'administration, l'office AI a informé l'assurée, par lettre du 20 décembre 2002, qu'il lui notifierait prochainement sa décision formelle. Par décision du même jour, l'office AI a rejeté la demande. L'assurée a complété ses arguments par lettre datée du 22 décembre 2002. L'assurée a complété ses arguments par lettre datée du 22 décembre 2002. B. B._ a déféré la décision du 20 décembre 2002 au Tribunal administratif du canton de Neuchâtel en concluant implicitement au versement d'une rente. En bref, elle a allégué que ses douleurs l'empêchaient de travailler et que l'évaluation de son invalidité était entachée d'une erreur de calcul. Par ailleurs, elle a reproché à l'administration de ne pas avoir donné suite à sa demande de consulter le dossier médical et d'avoir retiré inopportunément toute « possibilité de dialogue ». Par jugement du 31 août 2004, la juridiction cantonale a rejeté le recours. Par jugement du 31 août 2004, la juridiction cantonale a rejeté le recours. C. B._ interjette recours de droit administratif contre ce jugement dont elle demande l'annulation, avec suite de dépens, en concluant au renvoi de la cause aux premiers juges. L'intimé conclut au rejet du recours. L'Office fédéral des assurances sociales a renoncé à se déterminer.